分享功能存储权限适配
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卡权限的情况下,也可以访问第三方应用分享的图片。