You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 11 Scoped Storage下已获Uri权限仍无法使用java.io.File问题咨询

核心结论

你遇到的已获取SAF持久权限但仍无法使用java.io.File操作对应路径的情况属于完全预期的行为,同时getExternalMediaDirs()返回的路径访问规则如下:

  • 你自己应用包名对应的getExternalMediaDirs()返回路径,可直接用java.io.File访问,无需额外权限
  • 其他应用包名对应的/Android/media下路径,无法直接用java.io.File访问

具体原因解释

  1. SAF权限和文件系统权限是两套独立体系
    SAF授予的是你通过系统ContentProvider访问content://格式URI的权限,和Linux层的文件读写权限完全无关。你调用takePersistableUriPermission拿到的只是ContentProvider层面的访问许可,系统不会同步给你对应路径的Linux文件权限,所以直接用File操作必然抛出EACCES异常。
  2. /Android/media目录的访问限制
    Android 11及以上版本对/Android目录下的所有子路径都做了严格权限隔离:
  • 仅你自身应用包名对应的专属路径(包括/Android/media/[你的应用包名]、/Android/data/[你的应用包名]),你才有直接的文件系统访问权限,getExternalMediaDirs()返回的就是你自己的专属媒体目录路径
  • 其他应用的/Android/media/[其他应用包名]路径属于其他应用专属资源,没有MANAGE_EXTERNAL_STORAGE权限的前提下,你永远无法拿到该路径的文件系统访问权限,只能通过SAF授权后用ContentResolver操作对应URI
  1. 当前场景的正确操作方案
    放弃将SAF返回的content:// URI转换为本地文件路径的尝试,所有读写操作都通过ContentResolver实现:
  • 读文件:调用getContentResolver().openInputStream(uri)获取输入流处理
  • 写文件:调用getContentResolver().openOutputStream(uri)获取输出流处理
  • 查询/修改文件属性:通过DocumentsContract提供的API操作对应URI即可

内容的提问来源于stack exchange,提问作者Nicola Beghin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 02:36:04