API 33(Android 13)非媒体文件无法识别的技术求助
适配Android 13(API 33)查找非媒体.bin文件的解决方案
核心原因
Android 13对文件访问权限做了更细分的管控:
- 你配置的
READ_MEDIA_*权限仅覆盖媒体类型文件(比如.png属于图片媒体),非媒体文件(.bin)不在权限范围内 - Android 12的「允许管理所有文件」对应
MANAGE_EXTERNAL_STORAGE权限,但Android 13中该权限的申请逻辑和显示选项有调整,且谷歌仅允许特定类型应用(如文件管理器、备份类)申请使用
可行解决方法
方法1:使用MANAGE_EXTERNAL_STORAGE权限(仅适用于符合谷歌政策的应用)
- 在Manifest中添加权限声明:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
- 动态申请时,跳转到系统设置页让用户开启:
if (!Environment.isExternalStorageManager()) { val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) intent.data = Uri.parse("package:" + context.packageName) startActivity(intent) }
注意:若你的应用不属于谷歌允许的「需要全面文件访问」范畴(如普通工具类应用),上架Google Play会被拒绝。
方法2:引导用户将.bin文件移到应用专属目录
应用的专属目录(getExternalFilesDir(null))无需额外权限即可访问,你可以:
- 在应用内提示用户将.bin文件移动到
Android/data/[你的包名]/files/路径下 - 直接扫描该目录下的.bin文件,无需申请任何权限
方法3:使用系统文件选择器(ACTION_OPEN_DOCUMENT_TREE)
让用户手动选择包含.bin文件的目录,应用可获取该目录的访问权限:
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) startActivityForResult(intent, REQUEST_CODE_PICK_DIR)
在onActivityResult中拿到Uri后,用ContentResolver递归遍历目录下的.bin文件,这种方式无需特殊权限,完全符合Android 13的权限规范。
总结
若你的应用符合谷歌政策,优先用方法1;否则推荐方法2或3,既合规又能解决非媒体文件的访问问题。
内容的提问来源于stack exchange,提问作者MOTIVECODEX
相关产品推荐
相关产品推荐

