Android 11 微信,QQ ,微博 分享适配

Android 11 微信,QQ ,微博 分享适配

前言

最近收到客服反馈 有用户反馈微信分享不了,具体询问一番发现是Android 11的小米机器,然后依次试了 QQ 微博同样不行,于是着手进行适配工作,最新的Android 11 进行了分区存储,在升级到tagsdk=30的时候,我也试了一下,发现好多第三方都不行了,所以任用tagsdk=29
FileProvider 官网适配说明,帮助了解相关代码的含义:https://developer.android.google.cn/reference/kotlin/androidx/core/content/FileProvider

在这里插入图片描述

微信篇

微信官方说明相关连接如下:https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/Android.html#jump2
在这里插入图片描述
然后并没有什么用,依旧有问题!

然后在官网上有发现了一个地址:
OpenSDK支持FileProvider方式分享文件到微信官方:https://developers.weixin.qq.com/community/develop/doc/0004886026c1a8402d2a040ee5b401
在这里插入图片描述
这次是对了,照着进行适配即可;

注意点

1.String filePath = context.getExternalFilesDir(null) + “/shareData/test.png”;
// 该filePath对应于xml/file_provider_paths里的第一行配置:,因此才可被共享
这里有一行说明,在对应xml 配置里面下面的路径要写在第一行

<external-files-path name="sharedata" path="shareData/"/>

2.将路径通过FileProvider的接口转换成content://URI形式,这里的说明,因为写不对或者文件处理有问题会导致分享为黑图
在这里插入图片描述

即如果你分享微信用的是:mWXImageObject.imagePath = xxxxx;
这个方法,那需要注意这个路径必须是上面获取的content://URI的形式,当然这个路径需要对图片进行存储操作的,不然文件为空,分享出去是黑屏
在这里插入图片描述

public static String dealAndroid11FileWechat(Context context, Bitmap mBmp, File fileFilePri) {
    
    
        try {
    
    
            if (mBmp == null) {
    
    
                return null;
            }

            BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(fileFilePri));
            mBmp.compress(Bitmap.CompressFormat.JPEG, 90, outputStream);
            outputStream.flush();
            outputStream.close();

            // 微信使用contentPath作为文件路径进行分享
            return CommonUtils.getWeiChartFileUri(context, fileFilePri);
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }

        return null;
    }
public static String getWeiChartFileUri(Context context, File file) {
    
    
        if (file == null || !file.exists()) {
    
    
            return null;
        }

        Uri contentUri = FileProvider.getUriForFile(context,
                context.getPackageName() + ".fileprovider",  // 要与`AndroidManifest.xml`里配置的`authorities`一致,假设你的应用包名为com.example.app
                file);

        // 授权给微信访问路径
        context.grantUriPermission("com.tencent.mm",  // 这里填微信包名
                contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);

        return contentUri.toString();   // contentUri.toString() 即是以"content://"开头的用于共享的路径
    }

相关说明,上面中的 checkVersionValid,checkAndroidNotBelowN 这2个方法,微信官方文档里面有,就不列上去了,方法一 是对分区缓存文件的存储,方法二是获取 content 开头的路径,我这里加了一个 android11Path 这个变量存储 ,确保 `mWXImageObject.imagePath = android11Path,至于其他的非分区的文件存储还是以前的逻辑.最终分享的时候,自行判断 imagePath 是取content 开头,还是非分区的文件路径,到这里微信Android 11 分享处理完毕了。

因为 各自的分享整合的逻辑不一致,所以我就不贴具体的分享代码了,在现有逻辑上 去Android11Path ,还是以前的path ,实在不行:分享异常,Android 11及以上系统需使用FileProvider方式分享 微信分享失败(不讲码德),请参考:https://www.jianshu.com/p/05c83a83d876
有具体的代码。

QQ篇

分享功能存储权限适配官方文档:https://wiki.connect.qq.com
在这里插入图片描述
QQ 适配起来就很顺畅,没啥大问题,赞!,FileProvider 和微信用一个xml 注意加的位置就行

<provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${PACKAGE_NAME}.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>

微博篇

sinaweibosdk/weibo_android_sdk,github 地址:https://github.com/sinaweibosdk/weibo_android_sdk

在这里插入图片描述
具体的适配在这个目录下面有pdf 文档,适配起来还是挺顺畅的,因为我没有多图分享,微博多图分享,如下逻辑,但是我没有在文档里面看到相关配置信息 getExternalFilesDir(null) 这个在一点配置说明,就很尴尬!!!!

if (mShareMultiImage.isChecked()) {
    
    
            // 分享多图
            MultiImageObject multiImageObject = new MultiImageObject();
            ArrayList<Uri> list = new ArrayList<>();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    
    
                String authority = this.getPackageName() + ".fileprovider";
                list.add(FileProvider.getUriForFile(this, authority, new File(getExternalFilesDir(null) + "/aaa.png")));
                list.add(FileProvider.getUriForFile(this, authority, new File(getExternalFilesDir(null) + "/ccc.JPG")));
                list.add(FileProvider.getUriForFile(this, authority, new File(getExternalFilesDir(null) + "/ddd.jpg")));
                list.add(FileProvider.getUriForFile(this, authority, new File(getExternalFilesDir(null) + "/fff.jpg")));
                list.add(FileProvider.getUriForFile(this, authority, new File(getExternalFilesDir(null) + "/ggg.JPG")));
                list.add(FileProvider.getUriForFile(this, authority, new File(getExternalFilesDir(null) + "/eee.jpg")));
                list.add(FileProvider.getUriForFile(this, authority, new File(getExternalFilesDir(null) + "/hhhh.jpg")));
                list.add(FileProvider.getUriForFile(this, authority, new File(getExternalFilesDir(null) + "/kkk.JPG")));
            } else {
    
    
                list.add(Uri.fromFile(new File(getExternalFilesDir(null) + "/aaa.png")));
                list.add(Uri.fromFile(new File(getExternalFilesDir(null) + "/ccc.JPG")));
                list.add(Uri.fromFile(new File(getExternalFilesDir(null) + "/ddd.jpg")));
                list.add(Uri.fromFile(new File(getExternalFilesDir(null) + "/fff.jpg")));
                list.add(Uri.fromFile(new File(getExternalFilesDir(null) + "/ggg.JPG")));
                list.add(Uri.fromFile(new File(getExternalFilesDir(null) + "/eee.jpg")));
                list.add(Uri.fromFile(new File(getExternalFilesDir(null) + "/hhhh.jpg")));
                list.add(Uri.fromFile(new File(getExternalFilesDir(null) + "/kkk.JPG")));
            }
            multiImageObject.imageList = list;
            message.multiImageObject = multiImageObject;
        }

猜你喜欢

转载自blog.csdn.net/android_freshman/article/details/113122078