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

OPPO设备后台服务权限问题:缺失oppo.permission.OPPO_COMPONENT_SAFE

解决OPPO设备跳转自启动设置页的SecurityException问题

我之前也踩过OPPO这个私有权限的坑,咱们一步步捋清楚怎么解决:

首先得明确:oppo.permission.OPPO_COMPONENT_SAFE是OPPO的私有系统权限,普通第三方应用根本没法通过常规权限申请流程拿到——这个权限只开放给OPPO自家应用或者深度合作的应用,所以你直接跳转com.coloros.safecenter/.startupapp.StartupAppListActivity肯定会触发权限拒绝的报错。

那该怎么引导用户开启自启动来保活你的后台服务呢?给你几个可行的方案:

1. 引导用户手动操作(最稳妥)

别再尝试跳转私有设置页了,直接给用户清晰的操作指引就行,不同OPPO系统版本的路径略有差异,你可以整理成这样的提示:

请前往「设置」→「电池」→「应用耗电管理」→ 找到你的应用 → 开启「允许自启动」和「允许后台运行」
或者:「设置」→「应用管理」→ 你的应用 →「权限管理」→「后台运行」→ 允许

同时可以提示用户在多任务界面下拉锁定你的应用,避免被系统自动清理。

2. 跳转系统通用应用详情页

用Android系统提供的隐式Intent跳转到你的应用详情设置页,让用户从那里找到自启动/电池优化选项,这种方式不需要私有权限,代码示例:

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);

跳转后,用户可以在这个页面里找到「权限管理」「电池优化」等入口,进而开启自启动和后台运行权限。

3. 申请忽略电池优化权限

安卓系统的REQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限可以让应用避免被电池优化策略杀死,虽然OPPO上还是需要用户手动确认,但这是后台保活的重要补充,代码示例:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
    if (!powerManager.isIgnoringBatteryOptimizations(getPackageName())) {
        Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
        intent.setData(Uri.parse("package:" + getPackageName()));
        startActivity(intent);
    }
}

记得在Manifest里添加权限声明:

<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />

额外提醒

OPPO的后台管控非常严格,就算开了自启动,有时候系统还是会根据内存占用、耗电情况清理后台,所以除了上述设置,你还可以:

  • 给用户弹窗说明开启这些权限的必要性,让用户理解为什么需要这么操作
  • 如果你的服务是推送类的,尽量使用OPPO的官方推送服务,官方推送的优先级更高,不容易被杀死

内容的提问来源于stack exchange,提问作者Hồ Minh Tùng

火山引擎 最新活动