OPPO Lollipop版本:权限被拒后重申请及权限检查方法咨询
解决OPPO Lollipop版本联系人权限崩溃与二次申请问题
作为经常处理Android定制系统权限问题的开发者,我太清楚OPPO Lollipop(Android 5.x)这个权限坑了——它的定制化安全弹窗和原生权限逻辑差异很大,导致很多App在这里栽跟头。咱们分两部分解决你的问题:
一、先搞定拒绝权限后的崩溃问题
OPPO Lollipop会用自有安全弹窗替代原生权限请求框,当用户拒绝后,如果你的App没做任何权限校验就直接调用写入联系人的API,必然触发SecurityException崩溃。核心问题就是:不管系统弹的是啥弹窗,你都必须在执行敏感操作前主动检查权限状态,不能默认用户会授权。
具体实现:
每次要写入联系人前,先做权限检查,没有权限就终止操作并处理申请逻辑:
// 检查WRITE_CONTACTS权限状态 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS) != PackageManager.PERMISSION_GRANTED) { // 没有权限,走权限申请流程 requestContactsPermission(); return; // 别继续执行写入操作,避免崩溃 } // 有权限,放心执行写入逻辑 writeContactToDevice();
这个校验逻辑不管是OPPO定制弹窗还是原生系统都能生效,从根源上避免崩溃。
二、OPPO Lollipop上如何再次申请权限
OPPO在这个版本里有个特殊限制:一旦用户拒绝权限(尤其是勾选了类似“不再询问”的选项),原生的requestPermissions()方法不会再弹出权限弹窗,直接返回拒绝。这种情况下,你没法通过代码强制弹权限框,只能引导用户手动去应用设置页开启权限。
实现步骤:
- 在权限回调里判断是否需要引导到设置:
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQ_CODE_WRITE_CONTACTS) { if (grantResults[0] == PackageManager.PERMISSION_DENIED) { // 检查是否还能发起权限请求(OPPO Lollipop这里通常返回false) boolean canRequestAgain = ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_CONTACTS); if (!canRequestAgain) { // 用户拒绝且不想再被询问,弹引导对话框 showSettingsGuideDialog(); } else { // 还能再请求一次,重新发起权限申请 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_CONTACTS}, REQ_CODE_WRITE_CONTACTS); } } } }
- 实现引导到设置页的对话框和跳转:
private void showSettingsGuideDialog() { new AlertDialog.Builder(this) .setTitle("需要联系人权限") .setMessage("您已拒绝联系人写入权限,请到应用设置中开启权限才能使用此功能哦") .setPositiveButton("去设置", (dialog, which) -> { // 跳转到当前应用的详情设置页 Intent settingsIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); settingsIntent.setData(uri); startActivity(settingsIntent); }) .setNegativeButton("取消", null) .show(); }
额外提醒:
- OPPO Lollipop的权限逻辑和原生Android差异很大,不要依赖权限回调的结果直接执行操作,每次操作前都要主动检查权限状态。
- 测试时注意:用户第一次拒绝后,第二次申请可能直接进入引导设置的流程,这是系统限制,没法绕过,只能引导用户手动操作。
内容的提问来源于stack exchange,提问作者Maulik Patel




