Androidはワンツーパンチ 三歩進んで二歩下がる

プログラミングやどうでもいい話

Android 6.0 Marshmallow(API level 23) で導入されたDozeでダイアログから電池の最適化の無視を許可したのに設定画面の「最適化してないアプリ」一覧には反映されない問題

こんにちは。最近体調が不安定です。

Android 6.0 Marshmallow(API level 23) で導入されたDozeという機能があります。
Optimizing for Doze and App Standby | Android Developers

電池を長持ちさせるために、一定時間以上ユーザーがスマフォにアクセスしないとDozeモードが始まりアプリはネットワークやCPUの消費が激しい動きを制限されます。
Dozeモードはデフォルトでアプリに適用されています。「設定画面」→「電池」→「電池の最適化」を選ぶと「最適化してないアプリ」が表示されますが、ここを「すべてのアプリ」に切り替えてアプリ一覧を表示してどれかアプリをクリックすると最適化するかしないか選択するダイアログが表示されます。

こうしたDoze(やApp Standby)の機能にそぐわないアプリケーションの場合ホワイトリストに追加することで部分的にDozeモードから逃れることが出来ます。
ホワイトリストへの追加方法は以下の2種類です。

・上記の「設定画面」→「電池」→「電池の最適化」→「すべてのアプリ」→「アプリを選択後に表示されるダイアログから最適化しないを選択」
・AndroidManifestに「REQUEST_IGNORE_BATTERY_OPTIMIZATIONS」パーミッションを記述する。
http://developer.android.com/reference/android/Manifest.permission.html#REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
「ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS」をIntentにセットし許可ダイアログを表示する。
http://developer.android.com/reference/android/provider/Settings.html#ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS


具体的には以下の様なコードになると思います。

<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
        Intent intent = new Intent();
        String packageName = getPackageName();
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (pm.isIgnoringBatteryOptimizations(packageName))
                intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
            else {
                intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
                intent.setData(Uri.parse("package:" + packageName));
            }
            startActivity(intent);
        }

stackoverflow.com
こちらからコピペしてきたコードですので、説明などは参照元をみていただければと思います。

ここまでが前提なのですが、上記でユーザーがダイアログから許可をした場合に、設定画面の「最適化してないアプリ」一覧には反映されないという問題にぶちあたってしばらく悩みました。
こちらのサイト様で書いてくださっていますが、どうもAndroid側に問題があるようです。

qiita.com

許可したのに反映されてない画面

しょうがないので、adbのコマンドで確認します。(すぐ上でリンクしているqiitaのページにのっています。)

$ adb shell dumpsys deviceidle whitelist

結果に目的のアプリのパッケージが含まれていればホワイトリストに追加されていると確認することができます。

f:id:sakura_bird1:20160407001733p:plain