Android WRITE_EXTERNAL_STORAGE权限运行时请求疑问:测试设备为何无需申请?
这是几个关键因素共同作用的结果,我来逐一拆解:
targetSdkVersion 低于23(Android 6.0的API级别)
这是最常见的核心原因。Android 6.0引入运行时权限模型,但为了兼容旧应用,系统会对targetSdkVersion < 23的应用自动授予清单中声明的所有危险权限(包括WRITE_EXTERNAL_STORAGE),无需在运行时发起申请。如果你的应用编译时目标SDK版本设置为22或更低,即使在Android 6.0+设备上,也会触发这个兼容性逻辑,直接获得权限。厂商定制系统的权限默认授予策略
部分Android厂商(比如华为的EMUI)会对某些高频使用的权限做特殊处理,默认授予给应用,存储权限就属于这类常见权限。不过这个因素的优先级低于targetSdkVersion的影响,通常是在targetSdkVersion >=23时才可能出现,但也不排除部分早期定制系统的特殊逻辑。保存路径的特殊性(针对媒体文件)
如果你是通过MediaStoreAPI将图片保存到公共图片目录,而非直接通过FileAPI操作文件系统,在某些场景下可能会绕过权限检查?不过这个情况在Android 6.0-7.1中并不普遍,更多是Android 10及以上Scoped Storage引入后的变化,所以这个可能性相对较低。
如何测试运行时权限处理代码?
要验证你的权限逻辑,你需要:
- 将应用的
targetSdkVersion设置为23或更高; - 使用Android Studio自带的模拟器(选择API 23及以上的系统镜像),或者找一台
targetSdkVersion >=23时会严格执行权限检查的设备; - 首次启动修改后的应用,系统会弹出权限申请对话框,此时就能完整测试你的权限处理流程了。
另外,建议你始终按照Android官方文档要求实现运行时权限逻辑——即使当前测试设备不需要,随着targetSdkVersion的提升(比如未来适配更高版本Android),权限检查会强制生效,且不同厂商的系统策略也可能发生变化。
内容的提问来源于stack exchange,提问作者takluiper

