动态权限
Android M在2015年发布,6.0系统对于app权限设计跟之前的有了很大的变化.之前的系统在用户安装时提示一个应用需要的操作权限列表,用户同意权限之后就可以干任何事情了.6.0以后的系统对权限的使用有了更加严格的限制,每次使用到相关权限的时候就会弹出提示框让用户进选择.Android的这种权限设计对用户来说是更加安全的,作为开发者我们就不得不关注动态权限的申请.
权限分类
在6.0以后Android的权限可以分为两种:
常规权限
常规权限就是不涉及到用户隐私的权限,包括网络,蓝牙,NFC…,这种权限只需要在Manifest申请即可,应用安装的时候就授权了.
隐私权限
隐私权限就去读取或者修改用户的隐私数据,比如读取联系人,日历,短信,电话记录…..这种权限需要我们动态申请(targetSdkVersion>=23).
隐私权限的分类
隐私权限是以组(permission_group)的形式出现的,一共有9组,如下图:
注意:
1.隐私权限同样需要在Manifest注册,否则回调给开发者权限会被拒绝
2.在涉及到特殊权限操作时没有做动态权限的申请会导致App崩溃
3.如果同一个权限组的任何一个权限被授权了,那么默认该权限组都被授权,比如读取联系人被授权了,那么Contact岁组的所有权限都被授权
4.系统弹出的dialog的说明是对整个权限组进行说明而不是某个权限
5.应用启动时,最好先请求应用必须的一些权限,非必须权限在使用的时候才请求,防止一次请求太多的权限或请求次数太多,用户可能对你的应用感到厌烦和抵触心理.
代码动态权限申请
上面介绍了动态权限,现在我们就来使用动态权限.
动态权限申请关注4个方法,变量:
checkSelfPermission:检查是否授权了某些权限
requestPermissions:请求权限
onRequestPermissionsResult:用户选择的回调
shouldShowRequestPermissionRationale:用户拒绝过这个权限了,应该提示用户,为什么需要这个权限
PackageManager.PERMISSION_DENIED:拒绝
PackageManager.PERMISSION_GRANTED:同意
代码调用
检查,请求权限,第一次拒绝后,第二次申请给出提示
if (Build.VERSION.SDK_INT >= 23) {
int hasWriteContactsPermission = checkSelfPermission(Manifest.permission.CAMERA);
if (hasPermission != PackageManager.PERMISSION_GRANTED) {
if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) {
// 用户拒绝过这个权限了,应该提示用户,为什么需要这个权限。
}
requestPermissions(
new String[] { Manifest.permission.CAMERA }, REQUEST_CODE_ZXING_PERMISSIONS);
} else {
// 拥有该权限
}
}
用户选择回调
@Override
public void onRequestPermissionsResult(int requestCode,
String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == INTENT_REQUEST_CODE && grantResults[0] == 0) {
// 权限通过
}
}
通过上面的学习,相信大家对动态权限有了更加深刻的认识了,但是感觉每次申请权限都要写这么多代码,感觉很麻烦,以后有时间封装一个动态权限库,敬请期待!