Android 13+ 读取其他应用共享存储的方法及相关疑问咨询
Android 13+ 读取其他应用共享存储的方法及相关疑问咨询
你遇到的这个场景确实是Android 13+存储权限收紧后常见的问题,我来逐一解答你的疑问:
关于MediaStore的局限性
首先,/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media里的.nomedia文件就是专门用来告诉MediaStore不要索引该目录下的文件的,这是系统的既定规则,所以通过MediaStore确实无法获取到这里面的内容,这条路走不通。
关于SAF的两个核心疑问
- 持久化访问:如果用户通过SAF文件选择器授予了你对整个WhatsApp媒体目录的访问权限(注意是选目录,不是单个文件),你可以通过以下代码获取持久权限:
之后只要用户不在系统设置里手动撤销你的应用权限,你就可以一直访问该目录,不需要重复请求用户授权。val takeFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION contentResolver.takePersistableUriPermission(uri, takeFlags) - 新增文件的访问:只要你拿到的是整个目录的权限,后续该目录下新增的文件你完全可以正常读取,因为SAF的目录权限是针对路径层级的,不是绑定当前存在的文件列表。
其他替代方案
- MANAGE_EXTERNAL_STORAGE权限:这个权限可以让你直接访问所有共享存储,但Google Play的审核非常严格,只有文件管理器、备份恢复、杀毒类等明确需要全存储访问的应用才能通过审核,普通应用申请这个权限很大概率会被拒,不推荐。
- 应用专属Content Provider:有些应用会通过Content Provider对外暴露自己的文件,但WhatsApp目前没有公开这样的机制,所以这个方法可行性极低。
- 引导用户手动复制:如果以上方法都不适用,你可以引导用户手动将WhatsApp的媒体文件复制到你的应用可以直接访问的区域(比如
/storage/emulated/0/Android/data/你的应用包名/files/),不过这种方式用户体验比较差,属于兜底方案。
希望这些解答能帮到你!
备注:内容来源于stack exchange,提问作者Temporiz
相关产品推荐
相关产品推荐

