Android API 26调用getExternalFilesDirs仅返回单路径及/mnt/media_rw访问问题
问题1:/mnt/media_rw/*路径的来源是什么
/mnt/media_rw/是Android系统底层的可移除存储物理挂载目录,所有外接SD卡、USB存储设备都会被系统先挂载到这个路径下,该目录的访问权限仅开放给system用户、media_rw用户组,普通应用默认无访问权限。- 我们平时通过官方API拿到的
/storage/[卷ID]开头的路径,是系统通过FUSE(用户空间文件系统)层映射后的上层访问路径,专门给第三方应用使用,本质是/mnt/media_rw/对应卷的一层代理访问入口。
问题2:应用如何申请该路径的访问权限
- 普通应用不需要直接访问
/mnt/media_rw/路径,所有对可移除存储的访问需求都可以通过官方公开API实现:- 若仅需访问SD卡上的应用私有目录:直接使用
getExternalFilesDirs(null)返回的/storage/[卷ID]/Android/data/[你的应用包名]/files路径即可,Android 4.4及以上版本无需额外申请权限就可以直接读写。 - 若需要访问SD卡的公共目录:
- API 19~28(Android 4.4~9.0):申请
WRITE_EXTERNAL_STORAGE权限即可访问。 - API 29及以上:通过存储访问框架(SAF)发起
Intent(Intent.ACTION_OPEN_DOCUMENT_TREE),引导用户手动选择SD卡根目录授权,拿到对应Uri后即可操作目录下的所有文件。
- API 19~28(Android 4.4~9.0):申请
- 若仅需访问SD卡上的应用私有目录:直接使用
- 你看到的文件管理器申请的特殊权限,本质就是上述的存储访问框架目录授权,或是部分定制ROM开放的全局文件管理权限,不存在直接申请
/mnt/media_rw/路径访问权限的公开方式。
问题3:为什么仅API 26版本需要额外申请该权限,而其他版本无需申请
- 你遇到的这个现象不是Android系统的标准设计行为,而是API 26版本的原生Pixel模拟器镜像的已知bug:正常的API 26真机设备调用
getExternalFilesDirs(null)也会返回SD卡对应的/storage/开头的应用私有路径,不需要额外权限。 - 你通过反射拿到的
/mnt/media_rw/路径本身就不是给普通应用开放的访问入口,所有Android版本的普通应用默认都没有该路径的直接访问权限,其他版本你没有遇到这个问题,只是因为对应版本的模拟器运行正常,getExternalFilesDirs(null)正确返回了映射后的上层可访问路径,不需要你通过反射去获取底层挂载路径而已。
内容的提问来源于stack exchange,提问作者user924
相关产品推荐
相关产品推荐

