Android 11+外置SD卡自定义ContentProvider不同路径文件访问异常咨询
外置SD卡Android/data目录访问差异原因分析
1. Android 11+分区存储的底层硬限制
Android 11(API 30)开始强制启用分区存储机制,对外置SD卡的Android/data/、Android/obb/类应用专属目录做了最严格的访问隔离:
- 仅目录对应包名的应用自身可以直接读写该路径下的文件,无需额外申请权限
- 任何第三方应用(包括系统工具、浏览器、第三方编辑器),即便获得了
MANAGE_EXTERNAL_STORAGE权限,也无法直接访问其他应用在外置SD卡上的Android/data子目录,该限制由系统内核FUSE层强制执行,无法通过普通应用层逻辑绕过 - 外置SD卡的非
Android开头公共目录(如Documents、Download等)不属于应用专属沙箱范围,只要持有合法存储权限就可以被任意应用读写,这就是你提到的/storage/1234-5678/Documents/mytext.txt可正常被第三方应用访问的原因。
2. 自定义ContentProvider的授权逻辑被系统拦截
你自定义的ContentProvider能在Android 11以下正常工作,是因为低版本系统没有对外置SD卡的应用专属目录做跨应用访问的底层拦截。到Android 11+后,系统底层的权限校验优先级高于应用层自定义ContentProvider的授权:
- 你通过
ACTION_VIEW将自定义content://URI传递给第三方应用时,第三方应用调用读写接口的操作会触发系统FUSE层的路径校验,一旦识别到目标路径属于其他应用的外置SD卡专属目录,就会拦截写入操作,读取操作的拦截逻辑相对宽松,所以会出现readLine()读取失败、改用available()+直接read()可以临时读取的情况,但写入操作会被完全拦截 - 你将文件复制到非
Android/data开头的路径后,系统FUSE层没有访问限制,因此第三方应用可以正常读写。
3. 补充说明:FileProvider的原生限制
官方FileProvider本身仅支持处理应用内部存储、内置存储卡getExternalFilesDir()路径下的文件,外置SD卡路径默认不在FileProvider的允许路径范围内,即便你通过自定义ContentProvider绕开了FileProvider的路径限制,也无法绕开Android 11+的系统底层沙箱限制。
内容的提问来源于stack exchange,提问作者blackapps
相关产品推荐
相关产品推荐

