shouldShowRequestPermissionRationale 总是返回 false

Posted

技术标签:

【中文标题】shouldShowRequestPermissionRationale 总是返回 false【英文标题】:shouldShowRequestPermissionRationale always returns 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++;
        
    

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

【问题讨论】:

如果勾选“不再询问”,总是返回false 【参考方案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。我以前也犯过同样的错误。

【讨论】:

以上是关于shouldShowRequestPermissionRationale 总是返回 false的主要内容,如果未能解决你的问题,请参考以下文章