分享到 :

分享功能存储权限适配

A、重要说明

随着Android系统版本的更新,Android在存储空间以及访问权限都有一些变化。Android Q系统上,每个应用在外部存储设备提供了一个独立的沙箱存储目录,应用直接通过文件路径保存的文件都应该保存在应用的沙箱目录,应用卸载时应用沙箱目录会被删除。应用读写自己沙箱目录中的文件是不需要申请任何权限的,但是如果需要读取其他应用生成的多媒体文件就需要申请权限。具体可以参考google的开发者文档:

存储空间概览:https://developer.android.com/training/data-storage

手Q自从8.2.6开始也支持用户在无SD卡权限的情况下使用基础功能(不包括第三方分享),这时第三方应用在分享图片等文件到手Q时,如果是分享的是SD卡路径,将会导致分享失败。Google官方推荐文件分享方案是FileProvider:https://developer.android.com/training/secure-file-sharing

从QQ互联sdk3.3.8版本和手Q 8.2.8版本开始,分享功能同时支持通过FilePorvider分享到手Q。通过这种分享方式,即便手Q在无SD卡权限的情况下,也可以访问第三方应用分享的图片。

B、接口参数注意事项

从Android Q以后,由于应用在存储权限的限制,请确保shareToQQ、shareToQzone、publishToQzone三个接口参数中所填的图片路径所在的文件具备读权限。否则,分享到手Q的图片可能在手Q无法正常展示。

如果要使用FileProvider功能,则应该使用createInstance(String appId, Context ctx, String authorities)接口生成Tencent实例,其中authorities默认设置为${applicationId}.fileprovider, ${applicationId} 为你的应用包名。例如互联demo的authorities:com.tencent.sample.fileprovider

Tencent mTencent = Tencent.createInstance(mAppid, this,
"com.tencent.sample.fileprovider");

注意:除分享小程序、其他的分享方式从手Q 8.2.8版本支持FileProvider方式的分享。

C、FileProvider配置

在Android项目应用的AndroidManifest.xml添加如下配置:

<application>
...
<provider
            android:authorities="com.tencent.sample.fileprovider"
            android:name="android.support.v4.content.FileProvider"
            android:exported="false"
            android:grantUriPermissions="true"
            >
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths"/>
        </provider>
...
</application>


// ${applicationId} 为你的应用包名

在res/xml目录下新增file_paths.xml文件,如果res目录下没有xml目录则需要新增一个xml目录,文件内容如下:

<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-files-path name="opensdk_external" path="Images/tmp"/>
<root-path name="opensdk_root" path=""/>
</paths>

D、IUiListener添加onWarning回调, 如果authorities为空,sdk会回调这个接口,提醒开发者适配FileProvider

IUiListener qqShareListener = new DefaultUiListener() {
 ……
  @Override
  public void onWarning(int code) {
   if (code == Constants.ERROR_NO_AUTHORITY) {
    Util.toastMessage(QQShareActivity.this, "onWarning: 请授权手Q访问分享的文件的读取权限!");
   }
  }
};

E、常见问题

第三方应用把图片放到自己的专属目录里,然后以文件路径形式调用QQ互联SDK来向QQ分享。在 Android 11 上,QQ无法访问别的应用的专属目录,导致显示图片失败。

解决办法:QQ互联SDK 3.3.8版本支持通过FilePorvider分享文件到手Q。通过FilePorvider, 第三方应用可以赋予手Q读取分享的文件的权限。即便手Q在无SD卡权限的情况下,也可以访问第三方应用分享的图片。

返回顶部