web-dev-qa-db-ja.com

アプリでバッテリーの最適化が有効になっているかどうかを確認します

Android 6および7には、デバイスが使用されていないときにアプリのネットワークを制限するいくつかの電力最適化(居眠りモード)があります。

ユーザーは、バッテリー設定でアプリの最適化モードを無効にできます。

Android settings screenshot

アプリで最適化が有効になっているかどうかを確認することはできますか?アプリの機能を向上させるために最適化を無効にするようユーザーに要求する必要がありますが、プログラムで最適化を確認する方法がわかりません。

14
Nik

これは追跡するのが少しトリッキーでした:ここにあなたが探しているものがあります

PowerManager.isIgnoringBatteryOptimizations()

20
FriendlyMikhail

コトリン

/**
 * return false if in settings "Not optimized" and true if "Optimizing battery use"
 */
fun checkBatteryOptimized(): Boolean {
    val pwrm = applicationContext.getSystemService(Context.POWER_SERVICE) as PowerManager
    val name = applicationContext.packageName
    if (VERSION.SDK_INT >= VERSION_CODES.M) {
        return !pwrm.isIgnoringBatteryOptimizations(name)
    }
    return false
}

これは最適化アクティビティを表示します

fun checkBattery() {
    if (isBatteryOptimized() && VERSION.SDK_INT >= VERSION_CODES.Lollipop_MR1) {
        val name = resources.getString(R.string.app_name)
        Toast.makeText(applicationContext, "Battery optimization -> All apps -> $name -> Don't optimize", Toast.LENGTH_LONG).show()

        val intent = Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS)
        startActivity(intent)
    }
}
11
Evgenii Vorobei

マニフェストにこの権限を追加します。

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

ホワイトリストのリクエスト/アプリを有効にした最適化

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

サンプルコード:

 PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (pm != null && !pm.isIgnoringBatteryOptimizations(getPackageName())) {
                    askIgnoreOptimization();
                } else {
                    accepted;
                }
            } else {
                accepted;
            }

静的変数の宣言

private static final int IGNORE_BATTERY_OPTIMIZATION_REQUEST = 1002;

BATTERY_OPTIMIZATIONSのダイアログを表示

 private void askIgnoreOptimization() {

        if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.M) {
            Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
            intent.setData(Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, IGNORE_BATTERY_OPTIMIZATION_REQUEST);
        } else {
            openNextActivity();
        }
    }

このコードが役に立つかもしれません!

2
Yogesh Rathi