Android M 运行时权限管理

  • 如果代码中的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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值