Android应用获取内部存储读写权限失败求助(SDK23-35)
Android 13+权限拆分导致旧权限失效
从API 33开始,系统把原有的READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE拆成了细分的媒体权限:READ_MEDIA_IMAGES、READ_MEDIA_VIDEO、READ_MEDIA_AUDIO。如果你的应用访问的是媒体文件,旧权限在API33+设备上已经不生效,必须申请对应的新权限。混淆内部存储与外部存储的权限要求
Android的应用私有内部存储(路径/data/data/你的包名/)不需要任何权限就能读写,只有访问公共外部存储(比如相册、下载目录、SD卡)才需要权限。如果你的操作是针对内部私有存储,那加这些权限完全没必要,可能是你搞错了存储路径。缺少动态权限申请步骤
Android 6.0(API23)及以上,危险权限(包括存储类权限)除了在清单文件声明,还必须动态向用户申请:- 用
ContextCompat.checkSelfPermission()检查权限是否已授予 - 未授予时调用
ActivityCompat.requestPermissions()发起申请 - 通过
onRequestPermissionsResult()或ActivityResultAPI处理申请结果
只加清单声明不做动态申请,权限肯定拿不到。
- 用
全外部存储访问需要特殊权限
如果你的应用需要访问外部存储的所有文件(不是仅媒体),比如文档、下载目录里的非媒体文件,从Android 11(API30)开始,WRITE_EXTERNAL_STORAGE就被废弃了,必须申请MANAGE_EXTERNAL_STORAGE权限。这个权限不能通过常规弹窗申请,需要引导用户跳转到系统设置手动开启,而且Google Play对这类权限的审核极严,只有文件管理器、备份工具等特定类型应用才能通过审核。权限声明未做版本适配
要针对不同API级别做权限声明的条件限制,否则旧权限在高版本设备上无效:<!-- API < 33 适用的旧存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- API >=33 适用的媒体权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
内容的提问来源于stack exchange,提问作者Bhoon Hoki

