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

Android之检测外网连接性(ping) 有时候网络状态显示正常,但是实际网络是不能连接外网,故需通过http方式或者ping方式来检测。 外网连接性检测工具类 package com.android.demo.utils; import android.util.Log; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt... 阅读详情
AI摘要

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

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

在这里插入图片描述

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.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);

或者你也可以根据包名和类名来打开指定机型的权限管理界面的 Activity,不同的机型打开权限管理界面的方法都不同,所以你需要一个一个去适配其包名和类名。可以通过 ADB 命令来获取不同手机机型里权限界面的包名和类名(具体方法这里就不介绍了)。

// 华为机型手机权限管理界面跳转示例
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ComponentName comp = new ComponentName("com.huawei.systemmanager", "com.huawei.permissionmanager.ui.MainActivity");
intent.setComponent(comp);
startActivity(intent);

4、完整代码示例

【代码文件】activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:onClick="requestPermission"
        android:text="请求该权限"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:onClick="checkPermission"
        android:text="检查该权限"
        app:layout_constraintStart_toEndOf="@+id/button"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:onClick="getPermission"
        android:text="快速前往设置"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button" />
</androidx.constraintlayout.widget.ConstraintLayout>

【代码文件】AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.myapplication">

    <!--获取手机状态-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApplication">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

【代码文件】MainActivity.java

package com.android.myapplication;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.content.ComponentName;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        requestPermission(null);
    }

    // 请求权限
    public void requestPermission(View view){
        ActivityCompat.requestPermissions(this, new String[]{
                Manifest.permission.READ_PHONE_STATE
        },1);
    }

    // 判断权限是否处于不再询问状态
    public void checkPermission(View view){
        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();
        }
    }

    // 跳转至当前应用的详情页面
    public void getPermission(View view){
        AlertDialog alertDialog = new AlertDialog.Builder(this)
                .setTitle("权限设置")
                .setMessage("应用缺乏必要的权限,是否前往手动授予该权限?")
                .setPositiveButton("前往", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                        Uri uri = Uri.fromParts("package", getPackageName(), null);
                        intent.setData(uri);
                        startActivity(intent);

                        /* 华为机型手机权限管理界面跳转示例
                        Intent intent = new Intent();
                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        ComponentName comp = new ComponentName("com.huawei.systemmanager", "com.huawei.permissionmanager.ui.MainActivity");
                        intent.setComponent(comp);
                        startActivity(intent);*/
                    }
                })
                .setNegativeButton("取消", null)
                .create();
        alertDialog.show();
    }
}

// ContextCompat.checkSelfPermission(Activity, permission);
// ActivityCompat.shouldShowRequestPermissionRationale(Activity, permission);
// 特别注意:判断权限是否处于不再询问状态的代码有点小BUG,它必须申请过一次权限并且用户做出了选择之后判断才能够准确

如果文章中含有某些错误或其它问题,欢迎在下方评论留言,我会及时修改。

Android 关于9.0版本之后相机权限问题 权限有三种状态 1.用户已经同意该权限 2.用户拒绝了该权限,没有选中『不再询问』(Never ask again),那么下次再次启动时,还会提示请求权限的对话框 3.用户拒绝了该权限,并且选中『不再询问』,提醒用户手动打开权限 所以第三种,就是没有权限,也不会给你弹出系统权限 这是一个调取系统相机和使用知乎源码调取相册的方法: //知乎 调用系统相册 api 'com.zhihu.... 阅读详情

相关推荐

[车联网安全自学篇] Android安全之绕过直连、HOST校验、系统证书校验、代理检测、双向认证抓HTTPS数据

如果是你客户端,你需要拿到服务器的证书,并放到你的信任库中如果是服务端,你要生成私钥和证书,并将这两个放到你的密钥库中,并且将证书发给所有客户端。如果你是客户端,你要生成客户端的私钥和证书,将它们放到密钥库中,并将证书发给服务端,同时,在信任库中导入服务端的证书如果你是服务端,除了在密钥库中保存服务器的私钥和证书,还要在信任库中导入客户端的证书。...

橙留香Park的博客 1549

安卓抓取https的小技巧

在我们测试APP的时候,经常会有抓取https数据的情况,但是安卓和ios不同,ios可以通过安装证书来进行抓取,但是安卓的特殊性,往往是无法抓取的,因此,大多数的开发流程,为了应对这种情况,会在测试包中兼容两种协议https和http,方便测试 但是最近我获得了一个小技巧,来源于我的大佬教导的,我们可以通过adb命令来完成,抓取https的数据, 1,首先准备一根数据线,连接手机设备,输入命令adb devices 出现这个设备号的时候,就证明已经连接成功了 2,输入命令adb -s 设备号 lo

weixin_44038097的博客 1231

Android动态权限管理及不再询问的处理方法

用户可以选择授权或拒绝权限请求,甚至可以选择“不再询问”,从而禁止应用程序提示权限请求。动态权限管理是Android开发中重要的一部分,它使得应用程序能够在运行时请求所需的权限,并根据用户的选择作出相应的处理。相比于早期的静态权限,动态权限允许应用程序在运行时进行权限请求,从而提高了用户体验和安全性。在某些情况下,用户可能选择了“不再询问”选项,这意味着应用程序将无法再次向用户申请相应的权限。如有更多疑问,欢迎继续追问。通过以上步骤,我们可以引导用户手动授予权限,以便在用户手动授予权限后继续使用相关功能。

HackSquad的博客 661

移动端专项测试必备神器 — adb

01、Android调试桥 (adb),Android调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信。adb命令可用于执行各种设备操作(例如安装和调试应用),并提供对Unix shell(可用来在设备上运行各种命令)的访问权限。

myh919的博客 434

channel || channelGroup || ctx.writeAndFlush()发送字符串消息客户端接收不到的原因

一、原因 网络上传播的数据都是字节(二进制数据)类型。我们如果直接向网络流里面写入一个对象(如:String对象),是无法传输的。只有将对象序列化(转换为可以传输的字节类型)之后,才可以进行传输。所以问题的根源就很清楚了,需要把字符串转换成字节进行传输。、 二、解决办法 1、手动序列化 服务端: channelGroup.writeAndFlush(Unpooled.copiedBuffer("【客户端】"+remoteAddress+"已下线"+format.format(new Date()), Cha

haohaoxuexiyai的博客 4060

Unity 接入HybridCLR的点点滴滴,亲测三平台(PC、Android、WebGL)妥妥的。-问题分享

一入热更深似海啊,没有热更是真恼火啊,干啥啥不方便,动不动就得重新发包;说实在的,也是工作之余研究这个,在原有框架基础上接入这个热更,既要保持原有功能,还要支持热更,实实在在、断断续续搞了这么久,终于是接入并测通了,这一路是坎坎坷坷,下面把走过的弯弯绕绕记录下,希望对后来想接入的小伙伴有帮助吧。

GarFe的博客 1万+

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

在应用申请权限时,如果用户选择了禁止后不再提示(不再询问),那么未来再次向用户请求该权限时,系统将会默认禁止该权限。这时候只能靠用户手动去授予权限,通过设计一个提示选择框来让用户选择,如果用户的确是想要授予该权限,那么就跳转至该应用的权限设置界面。1、判断该权限是否处于禁止后不再提示(不再询问)2、提醒用户我们需要该权限,是否前往设置3、跳转当前应用的权限设置页面1、检查权限状态使用 Contex...

weixin_34312809的博客 1924

【C++】开源:ncurses终端TUI文本界面库

ncurses配置使用(TUI)

DevFrank的博客 3165

adb 当前界面 http请求_Android请求权限之不再询问或禁止不再提示

在应用申请权限时,如果用户选择了禁止后不再提示(不再询问),那么未来再次向用户请求该权限时,系统将会默认禁止该权限。这时候只能靠用户手动去授予权限,通过设计一个提示选择框来让用户选择,如果用户的确是想要授予该权限,那么就跳转至该应用的权限设置界面。1、判断该权限是否处于禁止后不再提示(不再询问)2、提醒用户我们需要该权限,是否前往设置3、跳转当前应用的权限设置页面1、检查权限状态使用 Contex...

weixin_34761438的博客 762

keil工程After Build/Rebuild添加带参.exe实现全流程(2):带参调用.exe的几种方法

keil工程After Build/Rebuild添加带参.exe实现全流程(2):带参调用.exe的几种方法。

kevin1499的博客 1617

【报错解决】OpenClaw 报错 `openclaw: command not found`:全局命令未加入系统 PATH 的深度排查与修复指南

在国产AI工具链开发中,OpenClaw作为关键命令行工具常出现command not found报错。本文深度分析该问题的根源——Linux环境变量PATH未包含用户级安装目录(~/.local/bin)。通过四种解决方案(临时PATH修改、永久配置、软链接、虚拟环境处理)和排错Checklist,揭示"命令存在却找不到"的本质是路径配置问题,特别适用于Docker/国产Linux/非root环境。文中强调理解Linux工具链机制对国产AI开发的重要性,并指出这是开发者掌握环境

博客 5382

Android6.0运行时权限各种状态的处理(禁止、禁止后不再提示/不再询问)

关于Android6.0运行时权限网上的教程很多,但大部分都不是很全,就是简单的申请一下,但是这样真的就完了吗?逻辑流程都走的通吗? 比如: 用户要是拒绝权限了呢? 要是拒绝权限了并且选择不再询问了呢? 要是用户选择一个权限后把剩下的就禁止掉了呢? 要是用户去系统选择权限的时候没有选择允许又回到咱们的程序当中了呢? 下面就解决这种问题:先来张图 有稍微的一点点丑,不过能看。 分析一下问题,用户禁止掉权限应该给个弹出框告诉用户没有授权有些功能是无法使用的,让用户去授权,用户禁止掉并且选上.

lanrenxiaowen的博客 4622

YOLOv8自定义训练:车牌识别全流程(从标注到推理,附可视化代码)

车牌检测全流程实践指南 摘要:本文详细介绍了基于YOLOv8的车牌检测完整实现方案。针对车牌检测中的三大难点(小目标、多角度、光照变化),提供了从数据准备到模型部署的全流程解决方案。重点包括:1)数据采集与标注规范;2)针对小目标的YOLOv8模型优化配置;3)K-means锚框聚类方法;4)训练参数调优策略。通过实际验证,该方法可获得95%以上的检测准确率,并附有完整的代码实现和可视化工具,便于开发者快速复现应用。 (字数:149字)

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 849

android 权限管理之判断禁止后不再提示

权限

qq_41790490的博客 8368

基于STM32设计的数字电子秤

当前项目是采用采用STM32+称重模块+OLED实现了简单的电子秤项目,称重模块上采用24位的ADC芯片,精度较高。实现了称重,校准、去皮等功能。

1万+

锂电池寿命预测 | Python实现基于LSTM长短期记忆神经网络的锂电池寿命预测

锂电池寿命预测 | Python实现基于LSTM长短期记忆神经网络的锂电池寿命预测

算法如诗的博客 1902

Android打开APP会有权限询问

Android打开APP会有权限询问,比如打开摄像头权限,如图 只要你在AndroidManifest.xml中配置了修改权限,那么就会自动询问权限,如下代码: <uses-permission android:name="android.permission.CAMERA" /> HTML 但是!!!!!!!!!!!!!很多时候不进行自动询问,怎么办?首先 Android为什么不自动询问权限? 经过测试发现,Android 6.0以后的系统都不会进行权限询问,要分为两种情

tanghui20的专栏 4333

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android手机动态获取多个权限请求,附带拒绝权限时勾选不再请求

获取请求: /** * 获取用户权限 */ private void permissionRequest() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ) { String[] permissions = new String[]{Manifest.pe...

u013772237的博客 667

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android中使用shouldShowRequestPermissionRationale判断权限被禁止

前言 Android6.0之后的有些权限需要去动态获取,这个过程中呢,我们或许会遇到这么几个方法。 1.ContextCompat.checkSelfPermission 检查权限是否允许 2.ActivityCompat.requestPermissions 请求某个或某几个权限 3.onRequestPermissionsResult 手动请求权限之后的结果回调 4.shouldShowReq...

yeluofengchui的博客 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android6.0运行时权限各种状态的处理(禁止、禁止后不再提示/不再询问

Android6.0运行时权限各种状态的处理(禁止、禁止后不再提示/不再询问 https://www.youkuaiyun.com/tags/MtTaAg4sMDg3ODM2LWJsb2cO0O0O.html

chezabo6116的博客 681

android 默认勾选权限_Android 6.0运行时权限申请,多权限申请并勾选不再询问后如何处理?...

简单记录下项目中使用框架[RxPermission](https://github.com/tbruyelle/RxPermissions) 申请权限处理所遇到的问题。参考图 [虾米生活App](https://shouji.baidu.com/software/25489697.html) - 启动页![做的比较细,站在用户体验的角度去考虑周全~](https://upload-images.j...

weixin_42392425的博客 365

android 禁用电话,android 禁止后不再询问

一、动态权限被禁止且不再提示(以读写权限为例)这种情况一般弹出Dialog提示用户前往设置界面开启权限,一般手机我们会前往 权限管理界面,且不同的生产厂商的手机具体方法不同,我们要做判断来适配。但对于有些手机的存储权限,我们会发现权限管理界面找不到打开的开关,例如:华为M2平板,它的打开存储权限在 应用管理界面 中。所以即使同一厂商的手机,我们也要筛选特殊情况前往 应用管理界面。1. HUAWEI...

weixin_42317730的博客 490

Android 6.0运行时权限申请,多权限申请并勾选不再询问后如何处理?

简单记录下Android项目中7.0系统申请危险权限处理所遇到的问题 使用的github三方框架 RxPermission 参考图 [虾米生活App] (https://shouji.baidu.com/software/25489697.html) - 启动页 ![做的比较细,站在用户体验的角度去考虑周全~](https://upload-images.jianshu.io/upload_i...

#虾米生活 博客V 4263

Android开发动态询问权限总流程

我们用它的checkPermissions方法,不用requestPermissions方法。首先是检查是否有相机权限,如果没有就询问相机权限,如果用户永久禁止权限又怎么处理。我们用它的requestCombinedPermission请求权限。还有问题可以私信我。

聪哥的专栏 1168

android动态权限 禁止,Android 动态权限库推荐

遇到很尴尬的动态权限问题,终于找到一个用起来比较舒服的库,教程也很详细示例代码// ---------------------------------- kotlin -------------------------------------------------frame_version_update.setOnClickListener {val rxPermissions = RxPerm...

weixin_42315824的博客 424

android obb权限,解决部分手机读取obb失败的问题

最近发现,有很小一部分海外的玩家在谷歌商店下载游戏之后,进游戏黑屏。从bugly上面查看报错日志,发现是读取obb文件失败了。谷歌商店规定超过100m的apk,需要分离obb上传。所以这种情况只会出现在谷歌商店的游戏包里面。我的项目里面读取obb是分成2种情况的,第一种,是unity本身的api读取,比如Resources.Load()方法。另一种,是通过java原始方法,找到obb文件的路径,然...

weixin_35690047的博客 1万+
上一篇: Win10短字符串导致硬盘损坏和Chrome访问路径蓝屏!
绘尘世间
博客等级 码龄6年 1粉丝 3原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值