QQ分享
QQ分享文件,如果使用Android11及以上环境进行测试时,必须把FileProvider加上。否则会提示非法文件路径或其他奇怪的崩溃和错误,QQSDK并不会给你输出具体的错误日志。
mTencent = Tencent.createInstance(APP_ID, context.getApplicationContext(),"XXX.fileprovider");
QQ的这个方法的第三个参数就是你所设置的FileProvider
public static synchronized Tencent createInstance(String var0, Context var1)
这个只用传两个参数的方法在环境为11以上时并没有弃用状态,不注意很容易混淆。
微信分享
微信分享回调把成功和取消统一为成功回调。详见以下官方说明
Android 11之后版本分享文件同样需要适配FileProvider
//初始化 WXImageObject 和 WXMediaMessage 对象
WXImageObject imgObj = new WXImageObject();
String contentPath;
if (checkVersionValid(context) && checkAndroidNotBelowN()) {
// 使用contentPath作为文件路径进行分享
contentPath = getFileUri(context, new File(bitmapPath));
}
else {
// 使用原有方式传递文件路径进行分享
contentPath = bitmapPath;
}
imgObj.setImagePath(contentPath);
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = imgObj;
//主要是以下代码
public String getFileUri(Context context, File file) {
if (file == null || !file.exists()) {
return null;
}
Uri contentUri = FileProvider.getUriForFile(context,
"com.palmpi.hcollege.feiyu.fileprovider", // 要与AndroidManifest.xml里配置的authorities一致
file);
// 授权给微信访问路径
context.grantUriPermission("com.tencent.mm", // 这里填微信包名
contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
return contentUri.toString(); // contentUri.toString() 即是以"content://"开头的用于共享的路径
}
如果要传2M以上的大文件,不要使用直接传入Bitmap方式实现,微信内部使用bundle通信(包括微博),入参不能过大。大文件统一使用本地文件路径的方式进行传输,这个在官方文档中没有明写,代码都写在demo中。
WXImageObject imgObj = new WXImageObject();
imgObj.setImagePath(contentPath);
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = imgObj;
微博分享
同上面所说,微博分享内部同样使用bundle传输数据,所以传输大文件需要将bitmap压缩一下。通过传输文件路径方式分享的方法在官方文档没有找到,也没有找到最新版本的api接口文档。微博的文档管理很差劲。
微博的SDK还有一个致命bug,就是首次分享有可能提示没有找到微博客户端的错误,发生这个错误的原因是微博sdk的init没有完成就进行了分享操作。现在网上主流方法是分享前延迟几毫秒,这个问题也在官方的github的issue上。
Start weibo client's composer fail. please init sdk before use it
以上是这几天自己封装社会化分享sdk所遇到的坑。
这几天会将本次面试的知识点整理到博客上。