【Android BUG记录】 社会化分享SDK踩坑记录

697 阅读2分钟

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以上时并没有弃用状态,不注意很容易混淆。

微信分享

微信分享回调把成功和取消统一为成功回调。详见以下官方说明

微信开放平台 (qq.com)

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所遇到的坑。

这几天会将本次面试的知识点整理到博客上。