Android 11下无需管理外部存储权限获取WhatsApp状态的方案咨询
解决方案
现有代码的问题
Android 11(API 30)开始强制开启分区存储,普通应用默认无法直接通过File API访问其他应用在/Android/media、/Android/data下的私有目录,你当前的路径写法直接访问WhatsApp的私有存储路径,系统自然会要求你申请MANAGE_EXTERNAL_STORAGE权限,这类权限仅对文件管理器、备份类等特定用途应用开放,状态保存类应用申请基本都会被谷歌Play驳回。
无需MANAGE_EXTERNAL_STORAGE的可行实现方案
方案1:使用存储访问框架(SAF)引导用户手动授权目录
这是官方推荐的合规方案,完全符合谷歌Play的权限政策:
- 调用SAF目录选择器,引导用户手动定位到WhatsApp的
.Statuses目录(Android 11+路径为/Android/media/com.whatsapp/WhatsApp/Media/.Statuses,低版本为原路径) - 用户授权后调用
takePersistableUriPermission方法持久化授权权限,后续无需重复引导用户授权 - 通过
ContentResolver即可读取该目录下所有状态文件,读取后可以直接写入你应用的私有目录或者公共媒体目录,不需要额外权限
示例发起授权的代码:
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply { // 可选:预先定位到WhatsApp的Statuses目录,减少用户操作步骤 putExtra(DocumentsContract.EXTRA_INITIAL_URI, targetUri) flags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION } startActivityForResult(intent, REQUEST_CODE_SAF)
在授权回调中拿到Uri后,即可遍历目录下的所有文件。
方案2:写入到应用私有隐藏目录
如果你只需要在自己应用内访问保存的状态,直接将读取到的状态文件写入到你应用的私有目录即可:
- 内部私有目录:
context.filesDir下创建隐藏文件夹,完全不需要任何存储权限,仅你的应用可以访问 - 外部私有目录:
context.getExternalFilesDir(null)下创建隐藏文件夹,不需要额外权限,用户连接电脑时可以看到,卸载应用时会同步删除
如果需要将保存的状态展示到系统相册供其他应用访问,直接通过MediaStoreAPI插入到公共媒体集合即可,API 29+不需要额外申请存储权限。
注意事项
- 不要尝试绕过分区存储限制直接使用File API访问其他应用的私有目录,Android 11+已经完全禁止该操作,即使临时生效后续系统版本也可能被拦截
- 所有读取其他应用目录的操作必须走SAF授权流程,完全符合谷歌Play的审核规则,不会因为权限问题被驳回
内容的提问来源于stack exchange,提问作者Abbasi
相关产品推荐
相关产品推荐

