Android6.0+权限的动态检查和申请

1. 检查是否获得权限

ContextCompat.checkSelfPermission(context, String permission)

如果应用具有此权限,方法将返回 PackageManager.PERMISSION_GRANTED,并且应用可以继续操作。如果应用不具有此权限,方法将返回 PackageManager.PERMISSION_DENIEDpermissionManifest.permission.READ_CALL_LOGManifest.permission.READ_PHONE_STATE之类的权限值。

2. 申请权限

权限编号在申请结果的回调函数中回传,用于分辨申请的权限,该方法为非阻塞方法。

ActivityCompat.requestPermissions(context, String[] 权限数组, 自定义权限编号);

回调函数如下,需在context指定的Activity中实现,requestCode为之前传入的自定义权限编号permissions权限grandResult数组储存每个权限的授权结果, 其值的范围和含义上述checkSelfPermission的返回值(PackageManager.PERMISSION_GRANTEDPackageManager.PERMISSION_DENIED

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {}

注意:如果试图动态申请的权限没有AndroidManifest.xml声明将导致弹出的权限申请窗口闪退

示例

//检查和申请权限
private void requestPermission(){
    //把需要检查的一组权限放在一个字符串数组里
    String[] permissions = new String[]{Manifest.permission.READ_CALL_LOG, Manifest.permission.READ_PHONE_STATE};
    //记录没有获得的权限数量
    int noPermission = 0;
    //检查权限
    for(String permission : permissions){
        if(ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
            this.phone_granted = false;
            noPermission++;
        }
    }
    //申请未获得的权限(直接把权限组传入)
    if(noPermission != 0){
        ActivityCompat.requestPermissions(this, permissions, MainActivity.PEMISSION_PHONE);

    }
}

//申请结果回调函数
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    //调用父类方法
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    //根据requestCode处理申请结果
    switch (requestCode){
        case MainActivity.PEMISSION_PHONE:
            //这里使用了一个变量保存权限获取情况,该变量会被之后的初始化代码用于检查权限
            this.phone_granted = true;
            for(int result : grantResults){
                if (result != PackageManager.PERMISSION_GRANTED) {
                    //权限组中有权限没有获取,初始化就无法进行,因此把授权情况设置为false
                    this.phone_granted = false;
                    break;
                }
            }
    }
    //尝试初始化权限相关的代码
    initPermissionRelatedTask();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值