Android请求权限之不再询问或禁止不再提示

当Android用户选择禁止应用的权限并不再提示时,应用需引导用户手动授权。本文介绍如何检查权限状态,创建 AlertDialog 提醒用户,并跳转至权限设置页面。关键步骤包括使用 ContextCompat.checkSelfPermission() 和 ActivityCompat.shouldShowRequestPermissionRationale() 判断权限状态,以及使用 Intent 跳转至权限设置。

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

在应用申请权限时,如果用户选择了禁止后不再提示(不再询问),那么未来再次向用户请求该权限时,系统将会默认禁止该权限。这时候只能靠用户手动去授予权限,通过设计一个提示选择框来让用户选择,如果用户的确是想要授予该权限,那么就跳转至该应用的权限设置界面。

在这里插入图片描述

1、判断该权限是否处于禁止后不再提示(不再询问)
2、提醒用户我们需要该权限,是否前往设置
3、跳转当前应用的权限设置页面

1、检查权限状态

使用 ContextCompat.checkSelfPermission() 方法来检查权限的授予状态。它将返回一个常量值,这个在 上篇文章 中有提到过。然后再使用 ActivityCompat.shouldShowRequestPermissionRationale() 方法判断该权限是否能够弹出带有请求权限的弹窗,这个是判断权限是否处于不再询问状态的重要方法。

根据上面两个方法,结合其逻辑则需要 checkSelfPermission() 方法返回“权限未被授予的状态常量”,同时 shouldShowRequestPermissionRationale() 方法判断该权限为“无法弹出权限申请框”,也就是返回布尔值 false。

同时满足上面这两个条件就表示该权限处于不再询问的状态。判断权限是否处于不再询问状态的代码有点小BUG,它必须申请过一次权限并且用户做出了选择之后判断才能够准确。

// 判断权限是否处于不再询问状态
if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_DENIED){
   
    if(!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_PHONE_STATE)){
   
        Toast.makeText(this, "该权限已被用户选择了不再询问!", Toast.LENGTH_SHORT).show();
    }else{
   
        Toast.makeText(this, "权限未被授予!", Toast.LENGTH_SHORT).show();
    }
}else{
   
    Toast.makeText(this, "权限已被授予!", Toast.LENGTH_SHORT).show();
}

2、创建 AlertDialog 对话框

使用 AlertDialog.Builder 构造器来创建一个对话框对象,然后再使用 setTitle、setMessage 等方法构造对话框的标题及信息等。

// 创建一个对话框
AlertDialog alertDialog = new AlertDialog.Builder(this)
        .setTitle("权限设置") // 设置标题
        .setMessage("应用缺乏必要的权限,是否前往手动授予该权限?") // 设置内容
        // 添加一个确认按钮并设置点击按钮后执行的代码
        .setPositiveButton("前往", new DialogInterface.OnClickListener() {
   
            @Override
            public void onClick(DialogInterface dialog, int which) {
   
                // 点击按钮后执行的代码...
            }
        })
        .setNegativeButton("取消", null) // 添加一个取消按钮,无命令执行
        .create(); // 创建对话框
alertDialog.show(); // 显示对话框

3、跳转权限设置页面

使用 Intent 和 startActivity() 等方法跳转到当前应用的详情页面进行权限设置。

// 跳转至当前应用的详情页面
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.
Android 9.0 (API 级别 28) 及以上版本中,权限管理变得更加严格,采用的是 Google 的新隐私保护机制——Android 防止后台运行权限AppOps API)。从这个版本开始,应用需要在运行时请求特定权限,并用户可以随时查看并控制应用的权限。 以下是获取权限的基本步骤: 1. **添加权限声明**: 在 `AndroidManifest.xml` 文件中的 `<uses-permission>` 标签内添加所需的权限,例如: ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> ``` 2. **运行时请求权限**: 使用 `ActivityCompat.requestPermissions()` 方法动态请求权限,示例: ```java ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_READ_EXTERNAL_STORAGE); ``` 其中 `this` 表示当前 Activity,`new String[]` 是权限列表,`REQUEST_READ_EXTERNAL_STORAGE` 是自定义的请求码。 3. **处理结果**: 在 `onRequestPermissionsResult()` 方法中检查用户的响应,允许、禁止取消操作: ```java @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { if (requestCode == REQUEST_READ_EXTERNAL_STORAGE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 用户同意了,你可以继续使用权限 } else { // 用户拒绝权限被撤销,处理相应逻辑 } } } ``` 4. **解释权限需求**: 在运行时,如果用户首次看到权限请求,你应该提供一个清晰的对话框告诉他们为什么需要这个权限。 记得要在用户第一次安装应用时提示权限,除非它们对应用的核心功能至关重要,否则建议在首次启动时先询问非关键权限
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值