6.0以后分出了危险权限,危险权限需要动态申请,他们分了组,如果申请了组内的某个权限,那么整个组的权限都会被授予
主要也就几个方法,方法懂了,剩下的就是逻辑了,先看几个重要的方法:
检查权限方法:
//第一个参数Context,第二个参数需要检查的权限
//被授权返回0,否则返回-1
PermissionChecker.checkSelfPermission(mContext, permission);
通常都这么写:
// true 表示授权 false表示没有授权
//PackageManager.PERMISSION_GRANTED值为0
PermissionChecker.checkSelfPermission(mContext, permission) == PackageManager.PERMISSION_GRANTED;
这里另外列出MIUI的权限检查方法,因为上面的方法对于MIUI不管用
//就是要这么写,Process是进程工具类,获的进程的一些信息
//被授权返回0,否则返回-1
PermissionChecker.checkPermission(mContext, permission, Process.myPid(), Process.myUid(), mContext.getPackageName())
申请权限方法:
//在activity中申请
//第二个参数为权限数组,第三个int参数需要记住,他相当于一个标识,一会要用
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 123);
走了申请权限的方法,就会出这个弹框。当然又有系统差异:
- 先说华为(EMUI)和原生:这2个表现一样,如果没有权限,走了这句代码,会弹出授权框,如果是已经授予过权限,走了上面的代码不会弹出授权框。
- 小米(MIUI):不论权限是否授予,只要走了代码就会弹。
- 魅族(Flyme):不论权限是否授予,都不弹
这里要强调下,只测试了CAMARE和CONTACTS两组权限,系统 EMUI(5.x) ,原生(7.x.x),MIUI(V9.x.x),Flyme(6.2.x.x)
授权回调方法:
走了上面的申请权限方法,用户选择完,就会回调
//第一个参数就是上面申请权限方法需要记住的标识123,第二个参数为你的申请权限的数组,第三个参数是授权回调的结果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {}
- 第二个参数permissions和第三个参数grantResults是对应的,假如permissions中第一项为照相机权限,则在grantResults中的第一项为0表示用户授予了权限,为-1表示拒绝。你可以用这2个数组来对比出哪些权限用户给了,哪些没给。
不再提醒权限方法:(用户勾选拒绝后不再询问)
//参数是一个权限,返回true或false
shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)
返回true表示用户没有勾选 拒绝后不再询问,你可以再去调用requestPermissions申请权限
返回false分几种情况:
1.用户勾选了 拒绝后不再询问,你只能引导用户去设置中开启权限了
2.用户自己在设置中把权限给关了...
3.系统禁止应用具有该权限!
总结一下:
权限处理就上面几个方法,重要的是授权逻辑,怎么才能在保证app正常使用不让用户反感授权,特别是用户拒绝授权的处理,或者偷偷去把权限给关掉的处理。
有一个点要注意:所有需要的权限都需要到manifests中注册,否则你写了动态申请的代码,也不出弹框。
这里提下百度地图,下面的同意按钮一点,好几个权限直接就给了,有一点点想法,但是我应该写不出来想法中的代码,以后水平高了再看看。
更新
2018.01.20 百度地图的授权,试了小米和努比亚直接给授权,但像华为,三星都是会弹系统授权框的。
对于生活理想,应该像宗教徒对待宗教一样充满虔诚与热情!