Android 11 Scoped Storage下已获Uri权限仍无法使用java.io.File问题咨询
核心结论
你遇到的已获取SAF持久权限但仍无法使用java.io.File操作对应路径的情况属于完全预期的行为,同时getExternalMediaDirs()返回的路径访问规则如下:
- 你自己应用包名对应的
getExternalMediaDirs()返回路径,可直接用java.io.File访问,无需额外权限 - 其他应用包名对应的
/Android/media下路径,无法直接用java.io.File访问
具体原因解释
- SAF权限和文件系统权限是两套独立体系
SAF授予的是你通过系统ContentProvider访问content://格式URI的权限,和Linux层的文件读写权限完全无关。你调用takePersistableUriPermission拿到的只是ContentProvider层面的访问许可,系统不会同步给你对应路径的Linux文件权限,所以直接用File操作必然抛出EACCES异常。 /Android/media目录的访问限制
Android 11及以上版本对/Android目录下的所有子路径都做了严格权限隔离:
- 仅你自身应用包名对应的专属路径(包括
/Android/media/[你的应用包名]、/Android/data/[你的应用包名]),你才有直接的文件系统访问权限,getExternalMediaDirs()返回的就是你自己的专属媒体目录路径 - 其他应用的
/Android/media/[其他应用包名]路径属于其他应用专属资源,没有MANAGE_EXTERNAL_STORAGE权限的前提下,你永远无法拿到该路径的文件系统访问权限,只能通过SAF授权后用ContentResolver操作对应URI
- 当前场景的正确操作方案
放弃将SAF返回的content://URI转换为本地文件路径的尝试,所有读写操作都通过ContentResolver实现:
- 读文件:调用
getContentResolver().openInputStream(uri)获取输入流处理 - 写文件:调用
getContentResolver().openOutputStream(uri)获取输出流处理 - 查询/修改文件属性:通过
DocumentsContract提供的API操作对应URI即可
内容的提问来源于stack exchange,提问作者Nicola Beghin
相关产品推荐
相关产品推荐

