【问题标题】:Android permissions - "Never ask again" selection is remembered foreverAndroid 权限 - 永远记住“不再询问”选项
【发布时间】:2018-06-26 08:11:41
【问题描述】:

我的应用要求用户授予相机权限。如果用户拒绝该权限,则在重新启动时再次请求他的权限。这一次,向用户显示“不再询问”复选框。如果用户选择不再询问复选框,则应用程序将永远无法请求许可。没关系。问题是我的手机永远不会忘记这个选择,它会记住这个选择。我删除了应用程序,清除了所有数据,但没有任何效果。

当我删除应用程序并重新安装它时,应用程序仍然无法请求许可。 我打开了 Settings-> Application Settings -> 然后我手动给了我的应用程序必要的权限。没关系。然后,我删除并重新安装它。但是应用程序仍然不能请求许可。我不想在每次安装时手动授予我的应用权限。如何重置“不再询问”复选框的选择。

if (Build.VERSION.SDK_INT >= 23)
{
    int hasPermission = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA);

    if (hasPermission != PackageManager.PERMISSION_GRANTED)
    {
        if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA))
        { 
            getErrorDialog("You need to allow Camera permission." +
                    "\nIf you disable this permission, You will not able to add attachment.", MainActivity.this, true).show();
        }
        return;
    }
}

public AlertDialog.Builder getErrorDialog(String message, Context context, final boolean isFromCamera) {
   final AlertDialog.Builder alertDialog = new AlertDialog.Builder(context);
   alertDialog.setTitle(getString(R.string.app_name)).setMessage(message);
   alertDialog.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
       @Override
       public void onClick(DialogInterface dialog, int which) {

           dialog.dismiss();
           if (Build.VERSION.SDK_INT >= 23) {
               if(isFromCamera){
                   requestPermissions(new String[]{Manifest.permission.CAMERA},
                           REQUEST_CODE_ASK_PERMISSIONS_CAMERA);
               }else {
                   requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                           REQUEST_CODE_ASK_PERMISSIONS_EXTERNAL_STORAGE);
               }
           }
       }
   });
   return alertDialog;
}

【问题讨论】:

  • 使用我的库:github.com/nabinbhandari/Android-Permissions 它还处理“不再询问”的情况。
  • 您必须使用 shouldShowRequestPermissionRationale() 处理权限
  • 使用我的库:(为了用户而删除了链接) @NabinBhandari 太糟糕了......像static PermissionHandler permissionHandler; 这样的代码permissionHandler 保留了我们显然拥有的活动参考活动泄漏... 这就是糟糕的应用程序的制作方式 ...您还应该测试它是否与“不保留活动”一起使用...我敢打赌它不会
  • “然后,我删除并重新安装它”——在一些 Android 6.0 开发者预览版中存在与此相关的错误,但我记得它已修复。您在什么设备上进行测试,它使用的是什么版本的 Android?
  • @CommonsWare ,我在 else 语句中添加了 requestPermissions() 方法,它可以按我的意愿工作。当我删除并重新安装该应用程序时,该应用程序现在要求请求。

标签: android permissions


【解决方案1】:

你无法改变这种行为(来自 Mark Murphy 的书):

如果用户检查并单击拒绝按钮,您不仅会 现在没有获得运行时权限,但所有未来的请求都会 立即调用 onRequestPermissionsResult() 表明您的 许可请求被拒绝。用户现在可以授予的唯一方法 您通过“设置”应用获得此权限。

在这种情况下你可以做的事情如下:

对于在被拒绝时,将您的应用完全保留在 无用状态,您可能会在应用启动时仅显示一个屏幕 上面写着“对不起,但这个应用程序对你没用”,有以下选项 用户卸载应用程序或授予您所需的权限。 请注意,shouldShowRequestPermissionRationale() 如果 用户拒绝该权限并选中复选框以要​​求您 不要再纠缠用户了。

因此,正如 Jaymin 正确指出的那样,您最好的选择是使用 shouldShowRequestPermissionRationale() 处理此问题。

【讨论】:

    【解决方案2】:

    添加下面的 else 块解决了我的问题。

    if (Build.VERSION.SDK_INT >= 23)
    {
         int hasPermission = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA);
         if (hasPermission != PackageManager.PERMISSION_GRANTED)
         {
             if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA))
             { 
                 getErrorDialog("You need to allow Camera permission." +
                         "\nIf you disable this permission, You will not able to add attachment.", MainActivity.this, true).show();
             }
             else
             { 
                 requestPermissions(new String[]{Manifest.permission.CAMERA}, REQUEST_CODE_ASK_PERMISSIONS_CAMERA);
    
             }
             return;
         }
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-19
      • 2016-02-10
      • 1970-01-01
      • 2017-03-31
      • 1970-01-01
      • 2018-01-03
      • 2016-01-07
      • 1970-01-01
      相关资源
      最近更新 更多