两种实现方案:
1.使用WXFileObject构造分享方法发送到微信;
2.调用系统分享方法,把文件直接发送到微信;
那么下面来分别看看怎么实现:
〇、准备工作
首先,需要在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的示例,所以这里贴一段自己写的方法给大家做参考,其他分享类型可以参考官方文档(https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Share_and_Favorites/Android.html )
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;
}
//ANDROID 11上微信分享得走FileProvider
Log.d("share", "SDK_INT=" + Build.VERSION.SDK_INT);
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) {
shareWechatFriend(context, file);
return;
}
//构建发送文件体
WXFileObject fileObject = new WXFileObject();
/*经实测,不给fileObject设置fileData,也是可以分享文件得,且大小默认10M以内
反而是设置了fileData属性的话,分享文件大小不能大于500kb,且在Android11以上无法分享,坑啊,
所以,在Android11上需要走FileProvider文件分享的方式*/
//设置需要发送的文件byte[]
//byte[] fileBytes = readFile(file);
//fileObject.setFileData(fileBytes);
fileObject.setFilePath(file.getAbsolutePath());
fileObject.setContentLengthLimit(1024 * 1024 * 10);
//使用媒体消息分享
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.