Android中shouldShowRequestPermissionRationale始终返回false问题求助
嘿,我一眼就发现了导致shouldShowRequestPermissionRationale始终返回false的核心问题,还有几个细节需要调整,让我慢慢给你说:
1. 权限参数完全不匹配
你代码里申请的是READ_SMS权限,但在onRequestPermissionsResult中判断权限合理性时,用的却是SEND_SMS!这两个是完全独立的系统权限,系统找不到SEND_SMS的授权记录,自然会返回false。
你需要把判断时的权限参数改成和申请一致的Manifest.permission.READ_SMS,同时请求码也建议对应修改(比如把PERMISSION_REQUEST_SEND_SMS改成PERMISSION_REQUEST_READ_SMS),避免后续混淆。
2. 确认Fragment中方法调用的正确性
在Fragment中,直接调用自身的shouldShowRequestPermissionRationale()方法就可以了,不需要依赖Activity的实现——你的代码写法本身没问题,但要确保传入的权限参数是正确的(也就是上面说的READ_SMS)。
3. 首次拒绝的逻辑验证
第一次用户拒绝权限但未勾选“不再询问”时,shouldShowRequestPermissionRationale应该返回true。如果修正权限参数后还是异常,要检查:
- 不要在首次申请权限前调用这个方法:此时用户还没有任何授权操作,方法会返回false,这是正常行为。
- 确认你的目标SDK 27的配置正确,这个版本的权限行为符合Android的标准逻辑,没有特殊兼容性问题。
修正后的代码示例
public class SettingsSettingsFragment extends Fragment implements ActivityCompat.OnRequestPermissionsResultCallback { private static final int PERMISSION_REQUEST_READ_SMS = 100; // 对应READ_SMS的请求码 private int counter = 0; public void readNumber() { if (person.getPhoneNumber() == null || person.getPhoneNumber().equalsIgnoreCase("")) { if (checkSelfPermission(getActivity(), Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED) { requestPermission(); } else { // 读取手机号的逻辑 } } } private void requestPermission() { requestPermissions(new String[]{Manifest.permission.READ_SMS}, PERMISSION_REQUEST_READ_SMS); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == PERMISSION_REQUEST_READ_SMS) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_DENIED) { // 使用正确的权限参数判断 boolean showRationale = shouldShowRequestPermissionRationale(Manifest.permission.READ_SMS); if (!showRationale) { // 用户勾选了“不再询问”,引导前往设置 showGoToSettingsDialog(); } else if (counter < 2) { // 弹窗说明手机号用途,提供再次申请的选项 showPermissionExplanationDialog(); counter++; } } } } // 补充你需要的弹窗方法 private void showGoToSettingsDialog() { // 实现引导到设置的弹窗逻辑 } private void showPermissionExplanationDialog() { // 实现说明权限用途的弹窗逻辑 } }
总结
最关键的修复就是把判断权限时的SEND_SMS改成READ_SMS,这应该能解决shouldShowRequestPermissionRationale始终返回false的问题。另外统一请求码的命名,能让代码更清晰,避免后续出现类似的参数混淆问题。
内容的提问来源于stack exchange,提问作者submerge

