Android存储权限踩坑记

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 也极为方便。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android系统权限 Android 是一个权限分隔的操作系统,其中每个应用都有其独特的系统标识(Linux 用...
    ZHLeo阅读 12,131评论 3 16
  • Android M 对权限管理系统进行了改版,之前我们的 App 需要权限,只需在 manifest 中申明即可,...
    Android轮子哥阅读 14,643评论 6 54
  • M 6.0O 8.0 M 6.0 Android 6.0 版本(Api 23)推出了 动态权限管理。 应用权限简介...
    敲代码的本愿阅读 4,776评论 1 2
  • 关于运行时权限 在旧的权限管理系统中,权限仅仅在App安装时询问用户一次,用户同意了这些权限App才能被安装(某些...
    Gavin_2020阅读 5,618评论 0 2
  • 对于6.0以下的权限及在安装的时候,根据权限声明产生一个权限列表,用户只有在同意之后才能完成app的安装,造成了我...
    野火友烧不尽阅读 3,233评论 4 1