Проверьте, включена ли оптимизация батареи для приложения

Android 6 и 7 имеют некоторые оптимизации энергопотребления (режим ожидания), которые ограничивают сеть приложений, когда устройство не используется.

Пользователь может отключить режим оптимизации для любого приложения в настройках батареи:

скриншот настроек Android

Можно ли проверить, включена ли оптимизация для моего приложения или нет? Мне нужно попросить пользователя отключить оптимизацию для улучшения функциональности приложения, но я не знаю, как проверить это программно.

2 ответа

Решение

Это было немного сложно отследить: вот что вы ищете

PowerManager.isIgnoringBatteryOptimizations()

Добавьте это разрешение в свой манифест.

<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);
        }
    }

Котлин

/**
 * 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)
    }
}

Образец кода:

 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();
        }
    }

Может быть, этот код полезен для вас!

Другие вопросы по тегам