Android 存储权限具体分两个,write和read,申请了其中一个时,整个存储权限就已被赋予。但是,在判断另一个权限时,系统API仍然会返回该权限未被授予。
例如,在代码某处申请了read_external_storage权限,并且授予,可以在系统设置中看到存储已被授予。然后在其他地方再判断write_external_storage权限,得到的结果是未授予,并且当要修改本地存储文件时,也并没有访问权限(经测试,至少9.0已上是没有写文件权限的)。
这就会导致一些问题,比如说在app某处只用到并且申请了read_external_storage权限,在其他地方需要用到写文件权限,如果不进行权限检查,在写文件操作时系统就会抛出 permission denied错误,但主进程不会崩溃,app在界面上不会有什么异常。错误就不易察觉。
因此,在读写文件之前一定要进行权限检查,当其中一个已被授予,另一个未获得授予时,进行requestPermission时仍会有系统权限弹窗弹出询问,前提是没有选择禁止后不再提示。
此外,对于shouldShowRequestPermissionRationale方法,用来判断是否点击过禁止后不再询问,是否要再进行权限申请。但是有个小问题,权限未申请过时此方法仍会返回false,此时不能作为判断依据,可以根据此权限是否第一次申请来判断。
正常申请过的情况下,shouldShowRequestPermissionRationale返回false则不再弹出权限申请,true则可以弹出权限申请。
Android动态权限申请最好做统一申请和判断处理,在baseActivity中编写申请处理逻辑。或者使用第三方框架 Acp 也极为方便。