Android 6.0动态权限的相关问题

来源:互联网 发布:淘宝批发市场女装 编辑:程序博客网 时间:2024/06/04 19:13

前阵子在公司研发的一款哭声翻译APP上市后,在部分小米机型和其他机型上出现一点击录音按钮就会软件卡死的情况,我当时也是百思不得解,但由于一直忙于其他事物,也没有忙于跟踪,最近突然在一个群上看到有人讨论Android6.0的动态权限问题,之前没听过这个词汇,然后百度搜索了一下才发现原来这是Android6.0特有的特性。

Android6.0 引入了一个新的应用权限模型,期望对用户更容易理解,更易用和更安全。该模型将标记为危险的权限从安装时权限(Install Time Permission)模型 移动到 运行时权限模型(Runtime Permissions):

安装时权限模型(Android5.1以及更早)。用户在应用安装和更新时,对危险权限授权。但是OEM和运行商预装的应用将自动预授权。运行时权限(Android6.0及以后)。用户在应用运行时,对应用授予危险权限。由应用决定何时去申请权限(例如,在应用启动时或者用户访问某个特性时),但必须容许用户来授予或者拒绝应用对特定权限组的访问。OEM和运营商 可以预装应用,但是不能对权限进行预授权(例外情况请看这里Create exception)。

运行时权限提供给用户关于应用所需权限更多的相关上下文和可视性,这也让开发者帮助用户更好的理解:为什么应用需要所请求的权限,授权将有什么样的好处,拒绝将有何种不便。用户可以通过设置中的菜单来撤销应用的权限。

受影响的权限

系统要求标记为危险(dangerous)的权限使用运行时权限模型。查看危险权限列表可以使用命令:adb shell pm list permissions -g -d。

Android6.0并不改变正常权限的行为。正常权限指的是所有非危险(non-dangerous)权限,包括normal,system和signature 权限。正常权限风险较低,用于容许应用以最小风险来访问隔离的应用级别的特性。在Android5.1和早期版本中,系统在安装时自动将正常权限授予请求的应用,并不提示用户。

危险权限列表如下:

这里写图片描述

请求

运行时权限模型适用于所有应用,包括预装应用。应用软件的要求包括:

运行时权限模型必须在所有运行Android6.0的设备上是一致的。这通过CTS来实施。应用必须在运行时提示用户进行授权。带有危险权限的预装应用,必须符合API level 23,必须维护Android6.0的AOSP权限模型(例如,应用安装的UI流程不应该脱离AOSP的packageInstaller的实现;用户可以撤销预装应用的危险权限;等等)。无界面的应用必须使用Activity来申请权限,或者与其他有相应权限的应用共享UID。细节请参考Headless applications。

权限迁移

在设备从Android5.x升级到Android6.0之后,授予应用的权限仍然有效。但是用户可以在任何时候撤销这些权限。

解决方案

1.手动去设置里面给软件相关权限授权,然后再运行程序,APP就能正常运行,当然这是不友好的做法,通过这种方式倒是能够验证是不是动态权限造成的APP崩溃;
2.在软件内部做一个动态权限管理机制,实现我们想要的目的,同时又能表现的具有亲和力,具体请参考这篇简书上博文,写得挺好的:http://www.jianshu.com/p/dbe4d37731e6/

以下是网友总结的可能几个坑的地方,我也归纳一下:

  1. 权限申请只能在Activity或者Fragment的上下文中,不能用getApplicationContext()。

    由于我们项目在应用初始化时要获取内存的存储路径并创建一系列文件缓存,这些操作都是写在Application的onCreate()中调用不同的Util工具类进行的,所以在Android6.0以上这么写就有点不太靠谱了。目前我的解决措施是在应用程序初始化时,先判断SDK版本,只对版本号小于23的app创建缓存文件,高于23的则在进入Activity之后再初始化。

  2. 权限申请时使用的请求码必须小于16。

    至于什么原因不太清楚,可能谷歌公司认为权限本来就不多,没必要将请求码弄得很大占用多余的内存吧。说到请求码,也就是上面代码中未定义的常量值REQUEST_CODE_PERMISSION_CONTACTS,如果你定义的这个值超过了15,运行时就会报安全异常,提示请求码必须小于16。

0 0