- 如果代码中的targetSdkVersion >=23的话都会有运行时权限管理
- 在代码中调用
checkSelfPermission(Manifest.permission.WRITE_CONTACTS)
方法来检查是否有某种权限,得到返回值:判断是否等于PackageManager.PERMISSION_GRANTED
:等于表示有该权限,不等于表示没有。
private void insertDummyContactWrapper() {
int hasWriteContactsPermission = checkSelfPermission(Manifest.permission.WRITE_CONTACTS);
if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
if (!shouldShowRequestPermissionRationale(Manifest.permission.WRITE_CONTACTS)) {
Toast.makeText(this, "do not remind me any more", Toast.LENGTH_SHORT).show();
}
requestPermissions(new String[]{Manifest.permission.WRITE_CONTACTS},
REQUEST_CODE_ASK_PERMISSIONS);
return;
}
afterGetPermission();
}
- 调用方法
requestPermissions(new String[]{Manifest.permission.WRITE_CONTACTS},REQUEST_CODE_ASK_PERMISSIONS);
来申请权限,会弹出选择框。
requestPermissions(new String[]{Manifest.permission.WRITE_CONTACTS},
REQUEST_CODE_ASK_PERMISSIONS);
- 重写方法onRequestPermissionsResult(),该方法在该方法会在请求权限后,无论是否授权,都会调用
onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults);
在这个里面:requestCode用于区分不同的权限申请动作,
granResults用于与PackageManager.PERMISSION_GRANTED进行比较以判断权限是否申请成功。
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case REQUEST_CODE_ASK_PERMISSIONS:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "WRITE_CONTACTS Denied", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "have not Denie", Toast.LENGTH_SHORT).show();
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
- 申请权限后,在alert中如果选中了不再提醒后,以后再申请权限时,不会有弹窗选择了。因此,用方法
shouldShowRequestPermissionRationale(Manifest.permission.WRITE_CONTACTS)
来判断是否有选择了不再弹窗。
if (!shouldShowRequestPermissionRationale(Manifest.permission.WRITE_CONTACTS)) {
Toast.makeText(this, "do not remind me any more", Toast.LENGTH_SHORT).show();
}
- 低版本兼容:在Android studio中直接使用API方法的时候会自动提示异常
if (android.os.Build.VERSION.SDKs_INT >= android.os.Build.VERSION_CODES.M) {
permission = checkSelfPermission(Manifest.permission.WRITE_CONTACTS);
}
或者,
用v4兼容包里面的ContextCompat.checkSelfPermission();
ActivityCompat.requestPermissions();
ActivityCompat.shouldShowRequestPermissionRationale(); 需要传入Context。