目前我正在编写一个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"? 提前感谢您的帮助。
答案 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。我之前犯了同样的错误。