在android6.0的源码中有这样一段代码
protected void startPhotoActivity(Intent intent, int requestCode, Uri photoUri) {
mPhotoUri = photoUri;
mStatus = Status.SUB_ACTIVITY;
CompactContactEditorFragment.this.startActivityForResult(intent, requestCode);
}
这边的 intent 传过来的是 ”android.media.action.IMAGE_CAPTURE“,这个 action 需要权限:
<uses-permission android:name="android.permission.CAMERA"/>
这样的一段代码放在 6.0 之前的版本上都是可以正常运行的。但是在6.0上运行就会出错,这就是android最新的运行时权限。
只要是涉及到隐私的权限,即使是在 manifest 中声明过,代码跑到的时候仍旧会要求用户授权。以下是在android6.0上的实现:
private static final int REQUEST_CODE_ASK_CAMERA = 1;
@Override
protected void startPhotoActivity(Intent intent, int requestCode, Uri photoUri) {
mPhotoUri = photoUri;
mStatus = Status.SUB_ACTIVITY;
//检查有没有获取拍照权限
if(ContextCompat.checkSelfPermission(mContext,Manifest.permission.CALL_PHONE)!=PackageManager.PERMISSION_GRANTED){
//如果没有获取权限,就去请求权限,这个操作是异步的
ActivityCompat.requestPermissions(mContext,new String[]{Manifest.permission.Manifest.permission.CAMERA},REQUEST_CODE_ASK_CAMERA);
}else{
CompactContactEditorFragment.this.startActivityForResult(intent, requestCode);
}
}
上面如果检测到没有权限,就会去请求权限,会弹出一个对话框,如果用户授权,然后会回调 onRequestPermissionsResult 这个方法,我们需要复写它来处理授权的结果:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE_ASK_CAMERA://这是搜门上面请求的code
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//表示授权成功,这时候就可以再去调用相机应用,当然这边需要将intent和requestCode存下来
CompactContactEditorFragment.this.startActivityForResult(intent, requestCode);
} else {
// 授权未成功
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
这样就实现了6.0的运行时权限。
并不是所有的权限都需要运行时授权,只有下面列出来的需要。其他的权限只需要在manifest中配置就可以,跟6.0以前的版本一样。可以看到下面的权限是分组的,如果一个组中某一个权限被授权了,那么这个组中的其他权限也将被授予。