本文实例为大家分享了Android实现app分享文件到微信的具体代码,供大家参考,具体内容如下
两种实现方案:
1.使用WXFileObject构造分享方法发送到微信;
2.调用系统分享方法,把文件直接发送到微信;
那么下面来分别看看怎么实现:
0、准备工作
首先,需要在AndroidManifest.xml中配置FileProvider信息,以适配10以后版本文件读取问题
AndroidManifest.xml
<provider android:name=\"androidx.core.content.FileProvider\" android:authorities=\"${applicationId}.fileprovider\" android:exported=\"false\" android:grantUriPermissions=\"true\" tools:replace=\"android:authorities\"> <meta-data android:name=\"android.support.FILE_PROVIDER_PATHS\" android:resource=\"@xml/file_paths\" tools:replace=\"android:resource\" /> </provider>
file_paths.xml
<paths> <external-path name=\"external_files\" path=\".\" /> </paths>
一、使用WXFileObject构造分享方法发送到微信
这种方式分享需要接入微信分享的SDK,分享到微信后可以显示来源。但是官方文档中没有WXFileObject的示例,所以这里贴一段自己写的方法给大家做参考,其他分享类型可以参考官方文档
ShareUtils.java
public static final String PACKAGE_WECHAT = \"com.tencent.mm\"; /** * 分享文件到微信好友 by WXAPI * * @param thumbId 分享到微信显示的图标 */ public static void shareFileToWechat(Context context, File file, int thumbId) { if (!isInstallApp(context, ShareUtils.PACKAGE_WECHAT)) { Toast.makeText(context, \"您需要安装微信客户端\", Toast.LENGTH_LONG).show(); return; } //构建发送文件体 WXFileObject fileObject = new WXFileObject(); byte[] fileBytes = readFile(file); //设置需要发送的文件byte[] fileObject.setFileData(fileBytes); fileObject.setFilePath(file.getAbsolutePath()); //使用媒体消息分享 WXMediaMessage msg = new WXMediaMessage(fileObject); //这个title有讲究,最好设置为带后缀的文件名,否则可能分享到微信后无法读取 msg.title = file.getName(); //设置显示的预览图 需小于32KB if (thumbId <= 0) thumbId = R.mipmap.ic_launcher; msg.thumbData = readBitmap(context, thumbId); //发送请求 SendMessageToWX.Req req = new SendMessageToWX.Req(); //创建唯一标识 req.transaction = String.valueOf(System.currentTimeMillis()); req.message = msg; req.scene = SendMessageToWX.Req.WXSceneSession; //WXSceneSession:分享到对话 // 通过WXAPIFactory工厂,获取IWXAPI的实例 IWXAPI api = WXAPIFactory.createWXAPI(context, WXEntryActivity.APP_ID, true); // 将应用的appId注册到微信 api.registerApp(WXEntryActivity.APP_ID); api.sendReq(req); } // 判断是否安装指定app public static boolean isInstallApp(Context context, String app_package) { final PackageManager packageManager = context.getPackageManager(); List<PackageInfo> pInfo = packageManager.getInstalledPackages(0); if (pInfo != null) { for (int i = 0; i < pInfo.size(); i++) { String pn = pInfo.get(i).packageName; if (app_package.equals(pn)) { return true; } } } return false; } /** * 图片读取成byte[] */ private static byte[] readBitmap(Context context, int resourceId) { Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resourceId); ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos); return bos.toByteArray(); } catch (Exception e) { e.printStackTrace(); } finally { closeQuietly(bos); } return null; } /** * file文件读取成byte[] */ private static byte[] readFile(File file) { RandomAccessFile rf = null; byte[] data = null; try { rf = new RandomAccessFile(file, \"r\"); data = new byte[(int) rf.length()]; rf.readFully(data); } catch (Exception exception) { exception.printStackTrace(); } finally { closeQuietly(rf); } return data; } //关闭读取file private static void closeQuietly(Closeable closeable) { try { if (closeable != null) { closeable.close(); } } catch (Exception exception) { exception.printStackTrace(); } }
效果如下:
二、调用系统分享方法,把文件直接发送到微信
此种方式的好处就是不依赖微信SDK,调用系统提供的分享弹窗来分享到微信。
/** * 直接文件到微信好友 * * @param picFile 文件路径 */ public static void shareWechatFriend(Context mContext, File picFile) { //首先判断是否安装微信 if (isInstallApp(mContext, ShareUtils.PACKAGE_WECHAT)) { Intent intent = new Intent(); intent.setPackage(PACKAGE_WECHAT); intent.setAction(Intent.ACTION_SEND); String type = \"*/*\"; for (int i = 0; i < MATCH_ARRAY.length; i++) { //判断文件的格式 if (picFile.getAbsolutePath().toString().contains(MATCH_ARRAY[i][0].toString())) { type = MATCH_ARRAY[i][1]; break; } } intent.setType(type); Uri uri = null; if (picFile != null) { //这部分代码主要功能是判断了下文件是否存在,在android版本高过7.0(包括7.0版本) //当前APP是不能直接向外部应用提供file开头的的文件路径, //需要通过FileProvider转换一下。否则在7.0及以上版本手机将直接crash。 try { ApplicationInfo applicationInfo = mContext.getApplicationInfo(); int targetSDK = applicationInfo.targetSdkVersion; if (targetSDK >= Build.VERSION_CODES.N && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { uri = FileProvider.getUriForFile(mContext, mContext.getApplicationContext().getPackageName() + \".fileprovider\", picFile); } else { uri = Uri.fromFile(picFile); } intent.putExtra(Intent.EXTRA_STREAM, uri); } catch (Exception e) { e.printStackTrace(); } } intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (getVersionCode(mContext, PACKAGE_WECHAT) > VERSION_CODE_FOR_WEI_XIN_VER7) { // 微信7.0及以上版本 intent.setAction(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_STREAM, uri); } mContext.startActivity(Intent.createChooser(intent, \"分享文件\")); } else { Toast.makeText(mContext, \"您需要安装微信客户端\", Toast.LENGTH_LONG).show(); } } // 建立一个文件类型与文件后缀名的匹配表 private static final String[][] MATCH_ARRAY = { //{后缀名, 文件类型} {\".3gp\", \"video/3gpp\"}, {\".apk\", \"application/vnd.android.package-archive\"}, {\".asf\", \"video/x-ms-asf\"}, {\".avi\", \"video/x-msvideo\"}, {\".bin\", \"application/octet-stream\"}, {\".bmp\", \"image/bmp\"}, {\".c\", \"text/plain\"}, {\".class\", \"application/octet-stream\"}, {\".conf\", \"text/plain\"}, {\".cpp\", \"text/plain\"}, {\".doc\", \"application/msword\"}, {\".exe\", \"application/octet-stream\"}, {\".gif\", \"image/gif\"}, {\".gtar\", \"application/x-gtar\"}, {\".gz\", \"application/x-gzip\"}, {\".h\", \"text/plain\"}, {\".htm\", \"text/html\"}, {\".html\", \"text/html\"}, {\".jar\", \"application/java-archive\"}, {\".java\", \"text/plain\"}, {\".jpeg\", \"image/jpeg\"}, {\".jpg\", \"image/jpeg\"}, {\".js\", \"application/x-javascript\"}, {\".log\", \"text/plain\"}, {\".m3u\", \"audio/x-mpegurl\"}, {\".m4a\", \"audio/mp4a-latm\"}, {\".m4b\", \"audio/mp4a-latm\"}, {\".m4p\", \"audio/mp4a-latm\"}, {\".m4u\", \"video/vnd.mpegurl\"}, {\".m4v\", \"video/x-m4v\"}, {\".mov\", \"video/quicktime\"}, {\".mp2\", \"audio/x-mpeg\"}, {\".mp3\", \"audio/x-mpeg\"}, {\".mp4\", \"video/mp4\"}, {\".mpc\", \"application/vnd.mpohun.certificate\"}, {\".mpe\", \"video/mpeg\"}, {\".mpeg\", \"video/mpeg\"}, {\".mpg\", \"video/mpeg\"}, {\".mpg4\", \"video/mp4\"}, {\".mpga\", \"audio/mpeg\"}, {\".msg\", \"application/vnd.ms-outlook\"}, {\".ogg\", \"audio/ogg\"}, {\".pdf\", \"application/pdf\"}, {\".png\", \"image/png\"}, {\".pps\", \"application/vnd.ms-powerpoint\"}, {\".ppt\", \"application/vnd.ms-powerpoint\"}, {\".prop\", \"text/plain\"}, {\".rar\", \"application/x-rar-compressed\"}, {\".rc\", \"text/plain\"}, {\".rmvb\", \"audio/x-pn-realaudio\"}, {\".rtf\", \"application/rtf\"}, {\".sh\", \"text/plain\"}, {\".tar\", \"application/x-tar\"}, {\".tgz\", \"application/x-compressed\"}, {\".txt\", \"text/plain\"}, {\".wav\", \"audio/x-wav\"}, {\".wma\", \"audio/x-ms-wma\"}, {\".wmv\", \"audio/x-ms-wmv\"}, {\".wps\", \"application/vnd.ms-works\"}, {\".xml\", \"text/plain\"}, {\".z\", \"application/x-compress\"}, {\".zip\", \"application/zip\"}, {\"\", \"*/*\"} };
效果如下:
以上,就是app通过微信分享文件的2种解决方式。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自学编程网。