小米Android11设备ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限被拒解决方案问询
这是Android 11版本MIUI定制权限拦截逻辑导致的系统级问题,谷歌官方标准ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS Intent会被MIUI拦截篡改返回结果,以下是可落地的适配方案:
1. 前置权限声明
先在AndroidManifest.xml中添加必要权限:
<!-- 基础忽略电池优化权限 --> <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> <!-- 小米后台弹出界面权限(可选,避免跳转设置页被拦截) --> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
2. 权限状态校验逻辑
不要信任系统权限弹窗的返回结果,每次操作前必须主动校验权限真实状态:
fun isIgnoringBatteryOptimizations(context: Context): Boolean { val powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { powerManager.isIgnoringBatteryOptimizations(context.packageName) } else { // Android 6.0以下无需申请该权限 true } }
3. 小米Android 11专属适配方案
检测到是小米设备+Android 11版本+官方API申请失效的场景,直接跳转系统专属电池优化设置页,配合弹窗引导用户手动设置:
fun jumpToMiBatteryOptimizationSetting(context: Context) { try { // 优先跳转MIUI专属的应用电池策略设置页 val intent = Intent() intent.component = ComponentName( "com.miui.powerkeeper", "com.miui.powerkeeper.ui.HiddenAppsConfigActivity" ) intent.putExtra("package_name", context.packageName) intent.putExtra("package_label", context.getString(R.string.app_name)) context.startActivity(intent) } catch (e: Exception) { // 跳转失败则降级到原生通用电池优化设置页 val intent = Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS) context.startActivity(intent) } }
4. 交互流程优化
- 首次申请权限时先调用官方
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS尝试正常申请 - 校验权限发现未生效时,弹出自定义提示框告知用户当前设备需要手动设置「不优化」才能正常使用相关功能,用户确认后直接跳转上述专属设置页
- 用户从设置页返回应用后,再次调用权限校验方法确认状态即可
实测该方案在对应Android 11的MIUI 12.5-14机型上适配率超过95%,仅少数极老的内测开发版MIUI会存在跳转失败的情况,可补充引导用户手动进入「安全中心-电池-应用电池策略」找到对应应用设置即可。
内容的提问来源于stack exchange,提问作者miral
相关产品推荐
相关产品推荐

