Android 11及以上版本允许自由读写的合法文件路径查询
认知正误确认
你此前对分区存储的认知存在偏差:Android 11(API 30)开始分区存储强制执行后,并非只有/Android/data、/Android/obb目录被拦截。所有硬编码绝对路径直接访问公共存储的方式都被限制,哪怕是Documents、Downloads、Pictures这类公共目录,直接用/storage/emulated/0/Documents/xxx路径读写,就算申请了旧版存储权限也会报错。
无需额外权限可自由读写的路径列表
以下路径你可以直接读写,不需要申请任何存储权限:
- 应用专属内部存储:通过
context.getFilesDir()、context.getCacheDir()获取,数据随应用卸载删除,其他应用无法访问 - 应用专属外部存储:通过
context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS)、context.getExternalCacheDir()获取,数据随应用卸载删除,仅你的应用可直接访问
公共目录读写适配方案
如果你的xml文件需要存到公共Documents目录,方便用户在系统文件管理器中直接查看,不需要申请特殊的全文件权限,有两种合法实现方式:
方案1:使用MediaStore API
针对xml这类文档类文件,你可以向MediaStore的文件集合插入数据,指定相对路径为Documents/Arbeitszeiten/,即可正常读写你自己的应用存入的文件,仅当你需要读取其他应用存入的公共目录文档时,才需要额外通过存储访问框架申请授权。
示例逻辑参考:
ContentValues values = new ContentValues(); values.put(MediaStore.Files.FileColumns.DISPLAY_NAME, "Arbeitszeiten.xml"); values.put(MediaStore.Files.FileColumns.MIME_TYPE, "application/xml"); values.put(MediaStore.Files.FileColumns.RELATIVE_PATH, Environment.DIRECTORY_DOCUMENTS + "/Arbeitszeiten/"); Uri uri = getContentResolver().insert(MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY), values); // 拿到uri后就可以打开输出流写入数据
方案2:使用存储访问框架(SAF)
调用系统自带的文件选择器,让用户主动授权你访问指定的目录/文件,授权后即可正常读写,适配成本极低。
不推荐方案
如果你申请MANAGE_EXTERNAL_STORAGE(所有文件访问权限)可以绕过分区存储限制直接读写任意路径,但Google Play对该权限有严格的审核规则,仅文件管理器、备份类等必须访问全量存储的应用才能过审,普通应用申请会被拒上架,不建议使用。
内容的提问来源于stack exchange,提问作者Chessmate
相关产品推荐
相关产品推荐

