You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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()方法不会再弹出权限弹窗,直接返回拒绝。这种情况下,你没法通过代码强制弹权限框,只能引导用户手动去应用设置页开启权限。

实现步骤:

  1. 在权限回调里判断是否需要引导到设置:
@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);
            }
        }
    }
}
  1. 实现引导到设置页的对话框和跳转:
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

火山引擎 最新活动