Android动态权限申请

本文介绍了Android从6.0开始引入的动态权限申请机制,不仅需要在Manifest.xml中声明权限,还需在代码中进行动态申请以避免应用崩溃。针对targetsdkversion小于23但手机系统大于6.0且某些手机厂商权限默认询问的情况,提出了使用support-v4包中的PermissionChecker类进行动态权限申请的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家都知道,Android在6.0之前的权限一般都是在Manifest.xml文件中配置了就可以了,但是谷歌6.0对于权限作了比较大的更改,现在不仅要在Manifest.xml中添加相应的权限,同时还需要在代码中动态添加权限申请,否则会出现app崩溃问题。
1.动态申请权限

private List<String> permissionList = new ArrayList<>();//用于存放需要授权的权限

private PermissionListener mPermissionListener;//授权回调监听

public void CheckRequestPermission(String[] permissions, PermissionListener listener) {

      this.mPermissionListener = listener;

      permissionList.clear();//每次申请之前清空之前的权限

       for (String permission : permissions) {
          int checkSelfPermission = ContextCompat.checkSelfPermission(this, permission);
          if (checkSelfPermission != PackageManager.PERMISSION_GRANTED) {//权限检测
                permissionList.add(permission);//将需要申请的权限加入列表中
           }
        }
        if (permissionList.isEmpty()) {//true 权限已开启

           mPermissionListener.permissionSuccess();
      } else {

            ActivityCompat.requestPermissions(this, permissionList.toArray(new 

            String[permissionList.size()]), REQUEST_CODE_PERMISSION);//权限申请
       }


    }
    //权限申请的回调
 @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, 

    int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CODE_PERMISSION:
                for (int grantResult : grantResults) {
                    if (grantResult != PackageManager.PERMISSION_GRANTED) {
                        mPermissionListener.permissionFail();
                        return;
                    }
                }
                mPermissionListener.permissionSuccess();
                break;
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

2.但是,会有这样一种情况,假如targetsdkversion 版本小于23,但是手机版本大于6.0,而且手机方案商(小米就是一例)对于一些手机的权限默认是询问的,所以也需要动态获取权限,但是用上面这种方法对于现在这种情况并不适用,所以也是非常伤脑筋,最后在还是找到了答案,也是同样动态申请,但是它是在support-v4包下PermissionChecker类中:

public void CheckRequestPermission(String[] permissions, PermissionListener listener) {

       this.mPermissionListener = listener;

        int selfPermission = PermissionChecker.checkSelfPermission(this, permissions[0]);

        if (selfPermission == PermissionChecker.PERMISSION_GRANTED) {
            listener.permissionSuccess();
        } else {
            listener.permissionFail();
        }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值