Android M 运行时权限管理

来源:互联网 发布:网络视频自己组装枪支 编辑:程序博客网 时间:2024/06/05 23:05
  • 如果代码中的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。

0 0