

Androidのバッテリー最適化を無効化する権限、実装は簡単だがPlayポリシーでほぼ使えない
この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。
Androidアプリのバックグラウンド処理を安定させたくて、バッテリー最適化を無効化する実装を調べた。結論から言うと、コード自体は簡単だがGoogle Playのポリシーで使用条件がかなり絞られているので、安易に組み込むと審査で弾かれるリスクがある。
何をするための権限か
Android 6.0(API 23)以降、Doze modeとApp Standbyという仕組みで、端末がアイドル状態になるとバックグラウンドのネットワーク・CPU・センサーアクセスが制限される。これはバッテリー持ちの観点では良いことだが、常時バックグラウンドで動く必要があるアプリ(VoIP、位置情報トラッキングなど)にとっては都合が悪い。
REQUEST_IGNORE_BATTERY_OPTIMIZATIONSは、ユーザーの許可を得て自分のアプリだけをこの制限の対象外にする権限。
実装
Manifestに権限を宣言する。これは通常権限(normal permission)なので、宣言するだけで付与され、実行時の許可ダイアログは出ない。
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>無効化をリクエストする側のコードはこう。
val pm = getSystemService(Context.POWER_SERVICE) as PowerManagerif (!pm.isIgnoringBatteryOptimizations(packageName)) { val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).apply { data = Uri.parse("package:$packageName") } startActivity(intent)}Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONSのIntentを投げると、システムが「バッテリー使用の最適化を無視しますか」というダイアログを出してくれる。ユーザーが許可すれば、そのアプリはDoze modeやApp Standbyの制限を受けなくなる。実装としてはこれだけ。
本題:Playポリシー上の制約
問題はここから。Google Playのポリシーでは、この権限はアプリの中核機能がバッテリー最適化によって実際に損なわれる場合以外でのリクエストを禁止している。「バックグラウンドで動かしたいから」程度の理由での申請はポリシー違反扱いになるらしい(未確認、自分で審査に通した実績はない)。
想定されている正当な用途は、調べた範囲だとVoIP通話アプリ、フィットネス・位置情報トラッキングアプリなど、バックグラウンド常駐そのものが提供価値の中心になっているアプリに限られている。
代替手段
中核機能がバックグラウンド常駐前提でないなら、この権限より先に検討すべきものがある。
- 継続的な処理が必要な場合: フォアグラウンドサービス+常駐通知にする。フォアグラウンドサービスはバッテリー最適化の対象から除外される
- リアルタイム性だけが必要な場合: FCMの高優先度メッセージで、必要なタイミングだけアプリを起こす
REQUEST_IGNORE_BATTERY_OPTIMIZATIONSは、それでも常駐が必須なケースのための最終手段として位置づけるのが妥当そう。
判断フロー
flowchart TD
A[バックグラウンド処理が止まる問題がある] --> B{アプリの中核機能が<br/>常時バックグラウンド常駐前提か}
B -->|No| C[フォアグラウンドサービス<br/>または FCM高優先度で解決]
B -->|Yes<br/>例: VoIP, 位置情報トラッキング| D[REQUEST_IGNORE_BATTERY_OPTIMIZATIONS<br/>をリクエスト]
D --> E[isIgnoringBatteryOptimizationsで<br/>事前チェックしてから表示]