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

Android M-检查运行时权限-如何确定用户是否勾选了“永远不要再问”?

龚镜
2023-03-14

根据以下内容:http://developer.android.com/preview/features/runtime-permissions.html#编码应用程序可以检查运行时权限,并在尚未授予权限的情况下请求权限。这时将显示以下对话框:

如果用户拒绝了一个重要的权限,imo一个应用程序应该显示一个解释,为什么需要这个权限,以及拒绝有什么影响。该对话框有两个选项:

  1. 重试(再次请求权限)
  2. 拒绝(应用程序将在没有该权限的情况下工作)。

但是,如果用户检查Never ask Again,则不应该显示带有解释的第二个对话框,尤其是如果用户之前已经拒绝了一次。现在的问题是:我的应用程序如何知道用户是否检查了永远不要再问?IMOonRequestPermissionsResult(int requestCode,String[]permissions,int[]grantResults)没有提供这些信息。

第二个问题是:谷歌是否计划在权限对话框中添加一条自定义消息,以解释为什么应用程序需要权限?这样就不会有第二个对话,这肯定会使用户体验更好。

共有1个答案

艾敏学
2023-03-14

Developer Preview2对应用程序请求权限的方式进行了一些更改(也请参见http://Developer.android.com/Preview/support.html#preview2-notes)。

第一个对话框如下所示:

没有“不再显示”复选框(不像开发人员预览1)。如果用户拒绝该权限,并且该权限对于应用程序是必要的,那么它可以显示另一个对话框来解释应用程序请求该权限的原因,例如:

if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_CONTACTS)) {...

为了帮助查找需要提供额外解释的情况,系统提供了Activity.ShouldShowRequestPermissionRationale(String)方法。如果应用程序以前请求过该权限,而用户拒绝了该请求,则此方法返回true。指示您可能应该向用户解释您需要该权限的原因。

如果用户过去拒绝了权限请求,并在权限请求系统对话框中选择了Don't ask again选项,则此方法返回false。如果设备策略禁止应用程序拥有该权限,则该方法还返回false。

要知道用户是否使用“Never ask again”拒绝,可以在用户没有授予权限时再次检查onRequestPermissionsResult中的shouldShowRequestPermissionRationale方法。

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == REQUEST_PERMISSION) {
        // for each permission check if the user granted/denied them
        // you may want to group the rationale in a single dialog,
        // this is just an example
        for (int i = 0, len = permissions.length; i < len; i++) {
            String permission = permissions[i];
            if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
            // user rejected the permission
                boolean showRationale = shouldShowRequestPermissionRationale( permission );
                if (! showRationale) {
                    // user also CHECKED "never ask again"
                    // you can either enable some fall back,
                    // disable features of your app
                    // or open another dialog explaining
                    // again the permission and directing to
                    // the app setting
                } else if (Manifest.permission.WRITE_CONTACTS.equals(permission)) {
                    showRationale(permission, R.string.permission_denied_contacts);
                    // user did NOT check "never ask again"
                    // this is a good place to explain the user
                    // why you need the permission and ask if he wants
                    // to accept it (the rationale)
                } else if ( /* possibly check more permissions...*/ ) {
                }
            }
        }
    }
}
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, REQUEST_PERMISSION_SETTING);

没有办法将用户直接发送到授权页面。

 类似资料:
  • 我想知道“永远不要再问”复选框布尔标志存储在哪里,如何清除它的值?不一定是通过编程,而是手动--通过设置、命令或某种工具。尝试清除应用程序数据,卸载,卸载和清除,尝试手动切换权限开/关来回,甚至尝试为模拟器设置一个更新的Marshmallow图像,但没有运气!

  • 但是,无论我拒绝多少次权限,我都不能在权限对话框中看到“永远不要再问”复选框,而且ShowRequestPermissionRationale总是返回false。 有什么不对劲吗?

  • 在我的应用程序中,我已经创建了一个类名Ungic,在那里我拧READ_EXTERNAL_STORAGE权限的代码。但问题是,当我点击拒绝应用程序,我没有找到警报通知设置它允许再次。起初,我有“永远不要再问”的选择。现在运行应用程序后,如果我点击拒绝,我不能再找到对话框消息,使其再次允许。我如何修改我的代码来每次显示此消息。 我的实用课程是 我的另一个类在这里我称之为实用类是

  • 有没有合适的方法知道“永远不要再问”的许可? =================================================================== 我想防止用户在没有授予位置访问权限的情况下进入屏幕。 ->检查权限 ->如果:权限已经授予,注册更新位置。 ->ELSE:未授予,用两个按钮显示授予权限的对话 PERMISSION_DENIED=> requestLo

  • 我想检查一个特定的应用程序是否需要在运行时处理Android Marshmallow运行时权限。 以下假设正确吗? 下面是我详细阐述的表格,例如,向具有Android Marshmallow运行时权限的用户请求权限时,需要使用权限。 我知道支持库助手的存在,但我想在这种特殊情况下避免使用它们。

  • 在我的应用程序中,我创建了一个类名untitility。在这个类名中,我从代码中获取read_external_storage的权限。但问题是,当我在应用程序上单击“拒绝”时,我找不到警报通知来再次设置“允许”。一开始我就有“不再问”的选项。一旦我点击它,对话框就会消失。现在运行应用程序后,如果我点击拒绝,我再也找不到对话框消息,使它再次允许。我如何修改我的代码,以显示这个消息每次。 我的另一个类