前言:
Android6.0已经出来蛮久的了,每次面试的时候也会问到关于Android 6.0的新特性,然而我每次就一句话回答(“增加了权限的动态管理”) 看面试官欲言又止的样子... 哎 不说了 如果再说详细点offer说不定就是你的了
介绍:
关于介绍 网上一大片的陈词滥调 重复一遍又一遍这里给出google官网的关于6.0权限变更的介绍 大家自行查看
Android 6.0 变更
重点:
- Android 6.0(API 级别 23)将权限分为normal、dangerous、signature和signatureOrSystem四个等级 我们只需要了解前面2种权限:
正常权限 比如获取网络状态:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
危险权限
通过adb命令可以查看
$ adb shell pm list permissions -d -g
- Android 6.0(API 级别 23)或更高版本为目标平台的应用,请务必在运行时检查和请求权限。要确定您的应用是否已被授予权限,请调用新增的 checkSelfPermission() 方法。要请求权限,请调用新增的 requestPermissions() 方法。即使您的应用并不以 Android 6.0(API 级别 23)为目标平台,您也应该在新权限模式下测试您的应用。
- 危险权限的同一组的任何一个权限被授权了,其他权限也自动被授权。例如,一旦WRITE_CONTACTS被授权了,app也有READ_CONTACTS和GET_ACCOUNTS权限了。
API使用
- 检查权限是否授权checkSelfPermission()
//返回值为int 如果为0代表已经授权
/**
*activtiy 申请权限的activtiy
*permission 检查的权限
/
int result=PermissionChecker.checkSelfPermission(activtiy,permission)
- 申请授权requestPermissions()调用该方法会回调Activtiy的onRequestPermissionsResult()方法 第一次请求授权,系统会默认弹出一个Dialog(不可定制) 拒绝后,再次请求授权,就会出现带“不再询问”选项的Dialog 勾选后 就不在弹出该Dialog。
/**
*this 申请权限的activtiy
*permission 检查的权限
*REQUEST_CODE 请求授权返回标识码
/
private static final int PERMISSION_REQUEST_CODE = 100;
ActivityCompat.requestPermissions(this, permission, PERMISSION_REQUEST_CODE);
3.授权回调onRequestPermissionsResult()通过requestPermissions()会触发该函数的回调
/**
*grantResults 申请权限组的授权返回码
*permissions 检查的权限组
*requestCode 请求授权返回标识码
/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){
}
建议:
- 在做权限动态申请的时候 例如:需要设备相机才能够拍摄照片 可以考虑使用Intent去启动系统的相机应用应用控制相机并拍摄照片 无需去调用摄像头 自己去实现 图像成型逻辑。其他情况 比如拨打电话、访问用户的联系人或要执行其他操作 都可以通过Intent去隐式的启动(缺点:在UI上不能控制)
- 在应用启动的时候,可以先请求应用必须的一些权限,对于不是必须的,可以在使用的时候,才请求(如一些附带权限),需要自己整理,管理一下自己应用的权限分类
- 自 Android 6.0 起,用户可以打开或关闭任何应用的权限,即使面向 API 级别 22 或更低级别的应用也是如此,再加上国内的厂商的系统定制 所以即使在API 23以下也需要做权限申请授权
- 在requestPermissions()申请授权前向用户解释应用需要相应权限的原因
封装:
如果涉及危险权限的申请地方太多的话 需要做些适当的封装 以便后续开发随时调用
- 检查是否已经授权
/*
*this 申请授权的Activtiy
*permiss 申请授权权限 可以是多个权限
*/
PermissionsUtil.hasPermission(this, permiss)
- 申请授权操作
/**
*this 申请授权的Activtiy
*PermissionListener 授权回调接口
*permiss 申请授权权限 可以是多个权限
*true 授权失败是否显示Dialog
*info 显示授权失败Dialog弹窗内容
/
PermissionsUtil.requestPermission(this, new PermissionListener(), permiss, true, info);
- 监听授权接口
public interface PermissionListener {
/**
* 授权成功
*/
void permissionGranted();
/**
* 授权失败
*/
void permissionDenied(String[] permission);
}