//经验证
1、checkPermission 是检测 清单文件下是否有注册权限,
2、checkSelfPermission 只有才 5.0的android机 上才有用
android5.0以下,只要清单文件中配置了该权限,我们check的时候就会返回true,无论用户的实际选择是怎样的
//检查权限的操作
int permission = ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
if (permission == PackageManager.PERMISSION_GRANTED) {
//有权限
} else {
//没有权限
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
showDiaglog();
}
}
//申请某项权限的操作,可以看出是支持一次申请多项权限的
String[] p = new String[]{Manifest.permission.CAMERA};
ActivityCompat.requestPermissions(AppScanActivity.this, p, REQUESE_PERMISSION);
//特别说明
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
用户拒绝后(没有记住该选择),下次我们可以在这里进行处理
例如:弹个吐司、再次申请权限等。如果用户拒绝后(并且记住该选择),那么我们的代码就
无法走到这里了。在此情况下,如果我们有申请权限的操作,那么系统会自动走到拒绝权限的回调中
还有就是,如果用户的选择是提示,那么系统也认为我们是没有该项权限的,但是代码也是可以走到这里的
}
//申请权限的回调,activity自有的方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (grantResults.length > 0) {
int grantResult = grantResults[0];
if (requestCode == REQUESE_PERMISSION && grantResult == PackageManager.PERMISSION_DENIED) {
//权限拒绝
} else if (requestCode == REQUESE_PERMISSION && grantResult == PackageManager.PERMISSION_GRANTED) {
//权限同意
}
}
}
那么,我们在低版本的时候怎么去判断用户究竟是选择了同意权限还是拒绝了权限?
目前方法只有一个,已打开摄像机为例:
我们在打开摄像机的时候去捕获异常,如果发生了异常,那么说明我们没有权限,如果成功打开,说明
我们其实是有权限的
try {
//这里去打开摄像机,如果没有发生异常说明我们拥有权限
mCamera = Camera.open(cameraId);
mPreview.setCamera(mCamera);
} catch (Exception e) {
//发生异常,说明没有权限
}
=====================================================
当我们调用activity的requesetPermission方法时候,系统是是通过startActivityForResult()方法请求的,这时系统会开启一个新的activity并调用原来activity的onPause方法,但不会调用onStop方法,用户选择同意或者拒绝后,栈顶activity消失,原activity调用onResume方法。整个过程为
activity.requestPermisson()----->onPause()----->用户选择----->onRequestPermissionResult()----->onResume(),整个周期结束。
可以肯定的是,虽然activity.requestPermisson()是通过startActivityForResult()方法请求权限的,但是回调不会执行onActivityResult()方法,只会执行onRequestPermissionResult()方法。
======================================================
如果我们在不同的位置同时对同一个权限进行请求,那么必定有一个位置的回调无法收到,另外就是能收到回调的位置貌似也无法收到结果了