如果用户已选中"再也不要再询问&#34 ;?如何避免requestPermission()

时间:2018-05-30 10:11:29

标签: android permissions android-permissions permission-denied user-permissions

我处理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,因为权限为DENIED且shouldShowRequestPermissionRationale正在返回false。我不想要那个。我想显示&#34;转到应用设置&#34;对话框仅在用户第一次选择&#34;不要再问及#34;。

所以我尝试了一些东西:

我在调用requestPermission()之前添加了此验证。我尝试删除对方法shouldShowRequestPermissionRationale()返回false的权限,因为它认为这些权限已选中复选框:

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()]);
}

它工作得很好但是......问题是你第一次打开应用程序时,第一次要请求权限... shouldShowRequestPermissionRationale()为所有人返回FALSE !!所以没有请求任何权限。

然后,如果用户已经检查过&#34;再也没有问过&#34;我怎么能避免callrequestPermission() ?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

所以这是对shouldShowPermissionRationale的错误使用。如果早先拒绝了许可(没有点击复选框),那就是这样。这是第一次总是假的。检查文档

/**
     * 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.如果权限被拒绝,如果用户必须具有权限才能将用户重定向到设置屏幕。

最佳实践:

始终将应用程序中必需和可选的权限分组,并忽略对可选权限的拒绝。