android 6.0 运行时权限的动态获取

本文介绍如何在Android 6.0中实现运行时权限的动态获取,包括在Activity和Fragment中检查并申请权限的过程。通过示例代码详细解释了如何使用ContextCompat和ActivityCompat来申请电话权限。

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

android 6.0 运行时权限在activity和fragment的动态获取


工作中肯定会遇到权限的问题,当时上网查帖子 解决了问题之后,没再看,就这两天不太忙,写个博客记录下来,温习一下,加深一下记忆,也方便以后查看
今天用电话权限为例子
首先要在配置清单中给电话权限

在activity 中检查权限并且 申请权限

在我们需要申请权限的Activity中检查是否拥有权限

if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                    Log.w("tag", "没有权限");
                    //这里是没有权限的  需要动态申请权限 然后在回调方法中获取申请结果
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);

shouldShowRequestPermissionRationale这个方法的名称叫 应该显示请求许可的理由吗?
                    //就是是用户点过禁止权限没有,没有放回false  点了返回ture  选了不在提醒那个 √ 一直返回 false
                    // 小米手机 点一次拒绝 一直返回的false                  if(ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.CALL_PHONE)) {
                        Log.w("tag", "我再次申请");
                        //这里返回 ture 说明 用户禁止了权限 但是没有点击不再提醒 我们可以再次申请权限,并且说明我们为什么需要这个权限
                    } else {
                        Log.w("tag", "你点了不在提醒");
                        //这里是一般我们弹出dialog 提示权限禁止,是否手动开启权限,然后跳往设置界面
                        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                        Uri uri = Uri.fromParts("package", getPackageName(), null);
                        intent.setData(uri);
                        startActivity(intent);
                    }
                } else {
                    Log.w("tag", "有权限 打电话");
                    //else 证明我们已经有权限了  直接进行我们想要打电话的操作
                    callPhone();
                }
   //这里是动态申请权限的回调方法
@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == 1) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Log.w("tag", "同意了权限");
                //这里是动态申请权限,用户同意了权限 继续我们的打电话操作
                callPhone();
            } else {
                //这里是动态申请权限,用户拒绝了我们的申请
                Log.w("tag", "禁止了权限");
            }
        }
    }

在fragment中申请权限

在fragment中申请权限 和activity 中有一点小小的不同
activity 中的申请方法

  ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);

fragment中的申请方法

 requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, 1);

fragment中申请权限不能使用activity中的requestPermissions 的方法,直接使用fragment中的方法,否则fragment中不会触发回调方法,而是触发activity的回调方法,要直接使用fragment的申请方法
//回调方法

 @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
   //使用activity的requestPermissions 不会在fragment中回调 在activity中回调
   // 直接使用fragment  requestPermissions方法就可以
    }
//简单的动态获取权限到这就结束了。有什么不对的地方欢迎指正
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值