一、6.0权限介绍
Android6.0提交对权限进行了较大的优化,权限根据用户隐私区分两类:一般权限和运行时权限。
targetSdkVersion小于23的应用默认授予了所申请的所有权限,当targetSdkVersion大于23时,使用未授权的运行时权限,就会导致应用崩溃。将APP的targetSdkVersion设置低于23,在运行时不会崩溃,但只是一个应急处理,不是长久之计。
二、运行时权限介绍
用户可对运行时权限进行开关,当应用使用未授权运行时权限时,就需要动态进行权限申请。
运行时权限分为9个权限组,权限组打开后,该组下所有权限都能正常使用。
- 权限查询、申请
//检查权限
if (ContextCompat.checkSelfPermission(thisActivity,Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
//申请提示
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
/提示操作
} else {
//申请权限
ActivityCompat.requestPermissions(thisActivity,new String[]{Manifest.permission.READ_CONTACTS},REQUEST_CODE);
}
}
- 处理回调
@Override
public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE:
if (grantResults.length > 0&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//成功
} else {
//失败
}
break;
}
}
- 注意:
Fragment中申请权限,不要使用ActivityCompat.requestPermissions, 直接使用Fragment的requestPermissions方法,否则会回调到Activity的onRequestPermissionsResult
如果在Fragment中嵌套Fragment,在子Fragment中使用requestPermissions方法,onRequestPermissionsResult不会回调回来,建议使用getParentFragment().requestPermissions方法,
这个方法会回调到父Fragment中的onRequestPermissionsResult
三、运行时权限框架使用
在开发过程中,使用如上代码来进行权限申请,重复代码量过多,所以下面介绍下开源框架
基于RxJava的运行时权限检测框架(个人倾向)
RxPermissions
RxPermissions rxPermissions = new RxPermissions(this); // where this is an Activity instance
Example : request the CAMERA permission (with Retrolambda for brevity, but not required)
// Must be done during an initialization phase like onCreate
rxPermissions
.request(Manifest.permission.CAMERA)
.subscribe(granted -> {
if (granted) { // Always true pre-M
// I can control the camera now
} else {
// Oups permission denied
}
});
Google官方的例子
android-RuntimePermissions
参考文献:感谢
Android 6.0 运行时权限处理