shouldShowRequestPermissionRationale始终返回false

时间:2018-05-26 09:16:59

标签: android permissions

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

要检查用户是否勾选了再也没有问过,我使用方法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"? 提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

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

如果应用先前已请求此权限并且用户拒绝了该请求,则

方法将返回true。 如果用户过去拒绝了权限请求,并在权限请求系统对话框中选择了“不再询问”选项,则此方法返回false

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

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

答案 1 :(得分:0)

您的requestPermission()用于READ_SMS,但是shouldShowRequestPermissionRationale()大约用于SEND_SMS

shouldShowRequestPermissionRationale()一直返回false,直到询问用户“相关”权限为止。请求后,它将返回true,直到用户拒绝选中“不再询问”相同的权限为止。

因此,就您而言,SEND_SMS从未被请求。因此shouldShowRequestPermissionRationale(Manifest.permission.SEND_SMS)将继续按预期返回false。我之前犯了同样的错误。