shouldShowRequestPermissionRationale方法的工作

时间:2019-06-02 05:22:48

标签: android android-permissions

我想在运行时请求权限。我签出了官方的android开发人员网站,它说如果以前拒绝了权限,则shouldShowRequestPermissionRationale返回true,如果拒绝了权限,则返回false,并且不再询问复选框。 然后我在网站上看到了这段代码:

if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {
        // Show an explanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.
    } else {
        // No explanation needed; request the permission
        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }

我的两个问题是:

1)如果以前未向用户请求权限会发生什么?我们需要问他对吗?您将代码放在哪里?

2)即使用户选中了“不再询问”复选框,以上代码也要求获得许可(当shoesShowRequestPermissionRationale在else块中返回false时)。当用户选中该选项时,您如何请求许可?

1 个答案:

答案 0 :(得分:0)

要回答两个问题:

您可以首先使用checkSelfPermission()来查看权限是否已经被授予。如果尚未批准,则应检查shouldShowRequestPermissionRationale()返回true还是false。

shouldShowRequestPermissionRationale()在以下情况下将返回true:

  • 当用户先前拒绝许可但尚未拒绝 选中了“不再询问”复选框。

shouldShowRequestPermissionRationale()在以下两种情况下将返回false:

  • 当用户先前拒绝许可并且从未询问时 再次选中该复选框。
  • 用户首次请求权限时。

因此,如果shouldShowRequestPermissionRationale()返回false,那么您可以做的是 您可以使用布尔型偏好值(默认值为true)来检查

  • 在其他情况下的首次许可请求(如果是第一次) 请求,然后触发requestPermissions

  • 否则,如果这不是第一个请求,并且用户先前已经拒绝了该请求,并且还选中了“不再询问”复选框,则可以显示一个简单的祝酒词,说明无法使用该功能的原因权限,并提及通过设置手动启用它的步骤。

类似这样的东西:

    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
                Manifest.permission.READ_CONTACTS)) {
            // Show an explanation to the user *asynchronously* -- don't block
            // this thread waiting for the user's response! After the user
            // sees the explanation, try again to request the permission.
        } else {
       if(isFirstTimeRequest){
            // No explanation needed; request the permission

            // RESET PREFERENCE FLAG

            ActivityCompat.requestPermissions(thisActivity,
                    new String[]{Manifest.permission.READ_CONTACTS},
                    MY_PERMISSIONS_REQUEST_READ_CONTACTS);

            // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
            // app-defined int constant. The callback method gets the
            // result of the request.
          } else {
            // User denied previously and has checked "Never ask again"
            // show a toast with steps to manually enable it via settings
          }
        }