Android 6.0 Runtime Permission 机制

来源:互联网 发布:沈阳软件外包公司 编辑:程序博客网 时间:2024/05/27 21:13
分析了Android的AppOps权限管理机制,可以说,该机制一直都在(应该是从4.2就开始存在了),但一直没有被真正使用过… 每次Android更新OS版本,都一直是隐藏它的( 一些OEM厂商可能会在某些版本上打开)。而从Android M开始,Android就正式的推出了官方的权限管理机制:Android Runtime Permission. ( Google在M发布的IO大会上特意说明了这一点~), 应该说,Android Runtime Permission有一些AppOps的影子,但却又是两套不同的机制。而且即使从M开始使用了Runtime Permission, Google 也没有把AppOpsService踢出,而且还保留和增加了个别基础的API..

 

  1. 简介:

    从Android M开始,用户对app权限的管理都会在app运行时(runtime)进行,而不是在app安装时。

    M之前: app安装时,系统会提示该应用所包含的所有权限。用户如果拒绝某项权限,只能选择不安装。

    M开始:app安装时不会再有权限的声明,但是需要在app运行时动态的给用户提示进行申请权限。

    

    

  2. 所有应用都要服从RuntimePermission机制吗?

    Target SDK  >= 23 的所有应用,强制使用runtimePermission机制。

    所以,如果app开发者想规避该机制,就需要把应用的TargetSDK设置为23以下。


  3. 对app开发者的要求?

    在runtime permission机制下,app安装时权限默认是disable的

    在app运行过程中,如果需要使用某些权限,app必须首先确认是否具有该权限,如果有,才可以继续进行相应的操作。没有的话需要向用户申请权限,只有用户同意使用该权限之后,才可以继续进行相应操作。

    如果不判断权限的情况就进行操作,app不会正常工作或者直接FC, 因为权限都是默认deny的,会有SecurityException。


  4. 都有哪些权限默认是disable的?

    系统权限被分为几个类别:Normal, Dangerous, Signature, SigatureOrSystem


    Normal Permission指的是那些 app获取它所在的sandbox(每个进程都有独立的一个沙箱)以外的数据和资源所对应的权限,这些权限一般不会对用户的隐私信息造成风险. 比如,设置时区的权限(SET_TIME_ZONE)。

    对于此类权限,app申请后系统会自动赋予。


    Dangerous Permission指的是那些可能对用户的隐私信息造成风险,或者可能影响用户数据的行为权限。比如读取用户的联系人。对于Dangerous Permission,app必须显示的获取用户的允许才可以正常使用。Runtime Permission机制针对的即是此类dangerous permission.

    


    Signature permission:权限请求者只有使用和[权限声明者]相同的证书来签名的情况下,才可以使用的权限。如果证书匹配,系统会自动赋予这些权限,不需要通知或请求用户。

 

    SignatureOrSystem: 该类权限除了上述的 Signature Permission以外,还包括那些只赋予Android System Image内的应用的权限。Android并不建议app使用这类,因为Signature Permission已经能满足大部分的需求,不管这些app是否是build在System Image里。

    对于此类权限,Android官方的说明如下:

    


  5. 如何检查权限状态(是否enable)?

    可以通过以下API来检查权限状态:

    android.support.v4.content.ContextCompat

    


  6. 如何向用户申请权限?

    申请权限API:

    android.support.v4.app.ActivityCompat

    public staticvoid requestPermissions (Activity activity, String[] permissions,int requestCode)

 

    App调用该接口后,系统会弹出一个dialog,用户做出选择后,系统会触发onRequestPermissionsResult()方法,并且传递用户所做的选择。

    App只需override该方法,根据用户的选择做出不同的操作即可。


  7. 申请权限前给用户一些解释

 

    Google建议在某些情况下,给用户一些解释,使其更好的明白你为什么需要申请该权限。比如,对于一个图片相关的app,如果要申请camera权限,用户可以理解。但是要申请定位权限或者打电话权限,就最好先给用户一些解释或说明。

 

    Android提供了一个接口 shouldShowRequestPermissionRationale,该方法在 “app之前申请过某项权限但是被用户拒绝” 时会返回true. Google建议首先app使用该API判断,如果结果为true,app最好向用户做出申请权限的解释。


  8. 其他需要注意的事项(googleadvice)

 

    只申请你确实需要的权限

    比如你的app需要拍摄照片,你可以选择申请camera权限,在app内进行操作,也可以发送intent使用系统的app进行同样的操作,你只需要得到它的结果即可,而这样是不需要权限的。

    不要惹怒用户

    只在需要该权限的时候才进行申请,不要一打开app就一次性弹出多个权限申请,那样可能会惹怒用户直接uninstall你的app。

    做好严格的测试

    用户随时可以禁止你的所有权限,所以app开发者必须保证测试路径的全面覆盖。

0 0