【问题标题】:shouldShowRequestPermissionRationale always returns falseshouldShowRequestPermissionRationale 总是返回 false
【发布时间】:2018-11-05 13:27:36
【问题描述】:

目前我正在编写一个读取用户电话号码的安卓应用程序。因为该应用程序是为 SDK 23+(目标 sdk 27​​)开发的,所以我必须请求读取短信权限。如果用户第一次拒绝该权限,则应出现一个对话框,解释电话号码的使用。然后用户可以选择再次请求权限或手动输入电话号码。如果用户勾选“不再询问”,则会出现一个对话框,指示用户通过设置允许权限。

为了检查用户是否勾选了不再询问,我使用了方法 shouldShowRequestPermissionRationale。但是该方法总是返回 false,即使我从来没有打勾也不会再问。

以下是相关代码:

public class SettingsSettingsFragment extends Fragment implements ActivityCompat.OnRequestPermissionsResultCallback {

public void readNumber() {

        if (person.getPhoneNumber() == null || person.getPhoneNumber().equalsIgnoreCase("")) {
            if (checkSelfPermission(getActivity(), READ_SMS) != PackageManager.PERMISSION_GRANTED)
                requestPermission();
            else {
//read phoneNumber
        }
    }
        //request permission send sms
private void requestPermission() {
    requestPermissions(new String[]{Manifest.permission.READ_SMS}, PERMISSION_REQUEST_SEND_SMS);
}

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == PERMISSION_REQUEST_SEND_SMS) 
            if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
                // user rejected the permission
                boolean showRationale = shouldShowRequestPermissionRationale(Manifest.permission.SEND_SMS);
                if (!showRationale) {
                    // user also CHECKED "never ask again" - show dialog
                   //show dialog: please allow in settings
                } else if (counter < 2) {
                   // explain the permission, and give the user the possibility to ask once more
                   counter++;
        }
    }

为什么 shouldShowRequestPermissionRationale 总是返回 false? 代码来自这里:Android M - check runtime permission - how to determine if the user checked "Never ask again"? 提前感谢您的帮助。

【问题讨论】:

  • 如果勾选“不再询问”,总是返回false

标签: android permissions


【解决方案1】:

根据shouldShowRequestPermissionRationale()的android开发者文档:

如果应用程序之前已请求此权限并且用户拒绝了该请求,则该方法返回 true。 如果用户过去拒绝了权限请求并在权限请求系统对话框中选择了不再询问选项,则此方法返回 false

如果您之前没有请求权限,它将返回 false,因为不需要弹出理性警报对话框。

This answer 对我理解问题很有帮助。

【讨论】:

    【解决方案2】:

    您的requestPermission()READ_SMS,但shouldShowRequestPermissionRationale() 是关于SEND_SMS

    shouldShowRequestPermissionRationale() 不断返回false,直到用户被要求“相关”权限。一旦请求,它会返回true,直到用户拒绝相同的权限并选中“不再询问”。

    因此,在您的情况下,永远不会请求 SEND_SMS。因此shouldShowRequestPermissionRationale(Manifest.permission.SEND_SMS) 将继续按预期返回 false。我以前也犯过同样的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      • 2021-11-05
      • 2019-05-06
      • 2017-04-29
      • 2013-04-30
      • 2015-01-20
      相关资源
      最近更新 更多