android M 权限使用方式

2,242 阅读2分钟

背景

从Android 6.0开始, 用户需要在运行时请求权限, 本文对运行时权限的申请和处理进行介绍, 并讨论了使用运行时权限时新老版本的一些处理.当然只有当项目中的targetSdkVersion>=23 才需要去申请运行时权限

当targetSdkVersion<23时 运行在Android M系统以上的机器上时google官方默认都是允许的(第三方系统除外,有些第三方还是会提示您是否允许权限)

1.检查权限

ContextCompat.javapublic static int checkSelfPermission(@NonNull Context context, @NonNull String permission)     //return  
    PackageManager.PERMISSION_GRANTED  //同意
    PackageManager.PERMISSION_DENIED   // 拒绝
PermissionChecker.java
 public static int checkSelfPermission(@NonNull Context context,
            @NonNull String permission)
    //return  
    public static final int PERMISSION_GRANTED =  PackageManager.PERMISSION_GRANTED;//同意
    public static final int PERMISSION_DENIED =  PackageManager.PERMISSION_DENIED; // 拒绝
    public static final int PERMISSION_DENIED_APP_OP =  PackageManager.PERMISSION_DENIED  - 1; // 当targetSdkVersion<23时 用户去设置界面关闭权限 返回值

第一次安装时,当targetSdkVersion<23时 上面两个方法 return PERMISSION_GRANTED
,否则 return PERMISSION_DENIED

两个的区别 ?????? 先卖个关子!(看注释大概就知道区别了)

2.申请权限

ActivityCompat.javapublic static void requestPermissions(final @NonNull Activity activity,
            final @NonNull String[] permissions, final @IntRange(from = 0) int requestCode) 
   // 类似startActivityOnResult 方法  有回调方法
void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                @NonNull int[] grantResults)

只要调用了 requestPermissions 它都会回调 onRequestPermissionsResult 如果targetSdkVersion<23时 调用ActivityCompat.requestPermissions默认也会回调onRequestPermissionsResult permissions.length=0 ,grantResults.length=0
如果targetSdkVersion>=23时如果允许权限了也还是会回调的

3.禁止询问对话框

ActivityCompat.java public static boolean shouldShowRequestPermissionRationale(@NonNull Activity activity,@NonNull String permission) {
    if (Build.VERSION.SDK_INT >= 23) {
        return ActivityCompatApi23.shouldShowRequestPermissionRationale(activity, permission);
    }
    return false;
}

看上面源码targetSdkVersion<23直接返回 false,targetSdkVersion>=23 默认false 当用户拒绝并且勾选不再询问返回false ,当用户只拒绝返回 true

问题一:ContextCompat和PermissionChecker中的 checkSelfPermission的区别???

区别在于 targetSdkVersion<23用户手动去设置中拒绝权限情况下 ContextCompat.checkSelfPermission 返回的还是PERMISSION_GRANTED,而PermissionChecker.checkSelfPermission 发回PERMISSION_DENIED_APP_OP。

问题二:申请多个权限 多次调用 requestPermissions问题

效果肯定不是你想想的!!! requestPermissions的调用到onRequestPermissionsResult回调这算一个完整的流程,当多次调用requestPermissions在onRequestPermissionsResult回调之前 只处理第一次请求。

-------------本文结束感谢您的阅读-------------