当前位置: 首页 > 知识库问答 >
问题:

如果用户选中了“不再询问”,如何避免requestPermission()?

穆鸿飞
2023-03-14

我正在处理Android中的随需应变权限,我发现了一个令人困惑的情况。我的目标是,如果用户在权限中选择了“不再询问”,则显示一个带有“转到应用程序设置”按钮的对话框。

好的,如果用户选择“永不再次询问”,那么下次您请求权限时,您可以通过方法onRequestPermissionsResult知道它是这样做的

public boolean checkIfShouldShowGoToSettingsDialog(String permissions[], int[] grantResults){
    for (int i=0; i<permissions.length; i++){
        if (grantResults[i] == PackageManager.PERMISSION_DENIED && !ActivityCompat.shouldShowRequestPermissionRationale(SectionManager.getInstance().getCurrentActivity(), permissions[i])) {
            return true;
        }
    }
    return false;
}

问题是,如果这样做,那么每次调用requestPermission(),即使之前拒绝了权限,甚至选中了复选框,也会再次调用onRequestPermissionsResult。因此,checkIfShouldShowGoToSettingsDialog返回的是true,因为权限被拒绝,shouldshowrequestpermissionrationalype返回false。我不想那样。我只想在用户第一次选择“不再询问”时显示“转到应用程序设置”对话框。

所以我尝试了一些东西:

我在调用requestPermission()之前添加了此验证。我尝试删除将返回false的权限给shouldshowRequestPermissionRegulation(),因为不支持选中这些权限的复选框:

public String[] removePermanentlyDeniedPermissionsFromArray(String[] permissions){
    List<String> result = new ArrayList<>();
    for (String permission : permissions) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(SectionManager.getInstance().getCurrentActivity(), permission)) {
            result.add(permission);
        }
    }
    return result.toArray(new String[result.size()]);
}

它工作得很好,但是。。。问题是,当你第一次打开应用程序时,当你第一次申请权限时。。。shouldshowRequestPermissionRegulation()对所有这些参数都返回FALSE!!因此,未请求任何权限。

那么,如果用户选中了“永远不要再问”,我如何避免调用请求权限()?

共有2个答案

芮念
2023-03-14

因此,以下是shouldshowPermissionRegulation的错误用法。如果先前拒绝了权限(未单击复选框),则为真。这是第一次,它总是错误的。检查文档

/**
     * Gets whether you should show UI with rationale for requesting a permission.
     * You should do this only if you do not have the permission and the context in
     * which the permission is requested does not clearly communicate to the user
     * what would be the benefit from granting this permission.
     * <p>
     * For example, if you write a camera app, requesting the camera permission
     * would be expected by the user and no rationale for why it is requested is
     * needed. If however, the app needs location for tagging photos then a non-tech
     * savvy user may wonder how location is related to taking photos. In this case
     * you may choose to show UI with rationale of requesting this permission.
     * </p>
     *
     * @param activity The target activity.
     * @param permission A permission your app wants to request.
     * @return Whether you can show permission rationale UI.
     *
     * @see #checkSelfPermission(android.content.Context, String)
     * @see #requestPermissions(android.app.Activity, String[], int)
     */

请求运行时权限的过程

1、生成未授予的权限列表。

List<String> permissionList = new ArrayList<>()
if(somePermission == PackageManager.PERMISSION_DENIED){
   permissionList.add(somePermission);
}
//so on
String[] permissionArray = permissionList.toArray(new String[permissionArray.size()]);

2.如果同时询问多个权限,原理可能会变得复杂,所以干脆忽略它。

3.使用上述生成的Array请求权限。

4.如果权限被拒绝,如果应用程序运行必须获得权限,请将用户重定向到设置屏幕。

最佳实践:

始终对应用程序中的强制和可选权限进行分组,并忽略对可选权限的拒绝。

姚星宇
2023-03-14

很高兴为大家解答问题,在我过去的项目中,也遇到过类似的问题,以下是我的解决方法。(1)为了避免重复提示,我们必须在用户第一次同意的时候,保存一个成功的令牌。等到下一次操作,先确定用户是否同意,如果同意,则不再提示。否则,再次提示用户。(2)这里我们需要使用一个开源的快速保存提醒标签的框架。为什么使用这个框架呢?因为它有一个方法,可以直接设置一个标签的有效期。具体用法可以在这里查看:https://github.com/yangfuhai/ASimpleCache

 类似资料:
  • 问题内容: 我是JSF的新手,只写了第一个简单的jsf网络应用程序。 具有.jsf的URL映射到WebContent中的.xhtml文件,但是为什么我可以使用所有jsf标签在Web浏览器中打开.xhtml。如何保护呢? 问题答案: 您可以在阻止所有对的请求时添加安全约束。

  • 我想知道,在调用之前,如何知道用户检查“Never ask Again”。 我已经通过了Android M-检查运行时权限-如何确定用户是否选中了“永远不要再问”?但还无法得到妥善的解决方案。 在此之前,请允许我解释一下我的动机。 null 我找不到区分两者的方法。

  • 问题内容: 我正在尝试通过从客户端向服务器发送密钥和随机数来认证用户。 我的代码未向我显示客户端的响应。执行下面的代码时,我得到了一个空指针异常。 问题答案: 解决大多数问题的固定步骤: 阅读堆栈跟踪以确定哪一行代码引发NPE 在该行代码处设置一个断点 使用调试器,在遇到断点时,确定该行中的对象引用是 弄清楚为什么引用该文件(到目前为止,这是唯一实际的困难部分) 解决根本原因(也可能很困难)

  • 问题内容: 我有两个简单的Java代码。第一个将恒定功率定义为power = a.pow(b); 第二个将恒定功率定义为power = BigInteger.ONE.shiftLeft(b) 在命令行中设置内存标志- Xmx1024m,第一个代码可以正常工作,但是第二个代码却出现错误:java.lang.OutOfMemoryError:Java堆空间 我的问题:我应该在第二个代码中更改什么以避免

  • 问题内容: 我有一个用于将文本添加到现有.doc文件中的代码,它将通过使用apache POI将其另存为另一个名称。 以下是到目前为止我尝试过的代码 以下是我得到的 我已经添加了与此对应的所有jar文件,但仍然找不到解决方案。我对apache poi是陌生的,所以请帮我提供一些解释和示例。谢谢 问题答案: 从我对问题的评论中复制: 看起来您需要Apache POI发行版中的poi-ooxml-sc

  • 问题内容: 级联正是CSS变得特别而强大的原因。但在媒体查询的情况下,重叠 可 似乎有问题。 考虑以下CSS(CSS媒体查询重叠的连续规则): 因此,当屏幕正好为45em宽时,将根据标准CSS级联来处理45em处的重叠: 所有定义都将首先应用, 并将在此之后全部应用。 请考虑以下两个条件: 通常,所有文本都是,但是 查询A 是唯一的并且具有。 由于 查询B 适用于较大的视口,因此其文本具有CSS