Подтвердить что ты не робот

Как приложение WhiteList в режиме "Доза" Android 6.0

Этот вопрос связан с Android 6.0 Preview 3, который будет окончательно выпущен в конце этого месяца.

Я тестирую некоторые вещи в Android 6.0 в предварительном просмотре 3 из Google на Nexus 5 'hammerhead.

Новая функция - режим "доза" - что-то вроде глубокого спящего режима, когда сеть отключена, а телефон спит, только SMS, звонки или сообщения GCM с высоким приоритетом могут разбудить его. Но, как и WhatsApp - в режиме "доза" он получает сообщения через 2 часа и более, зависит от таймеров. Но есть список "не оптимизированных" приложений под названием "белый список", где можно вручную добавить приложение.

Хорошо, я хотел бы найти способ для добавления моего приложения программно без участия пользователя в список "Список списка белых списков", который существует в устройстве в настройках батареи.

Пытаясь использовать отражение, чтобы попасть в него, я обнаружил:

Внутри android.os.IDeviceIdleController существует метод:

public abstract void addPowerSaveWhitelistApp (String packageNameOfApp)

Но это интерфейс... Поэтому мы не можем создать экземпляр интерфейса.

Пока нет документации об этом интерфейсе или о методах или любом дереве наследования.

Может быть, у вас есть идея, где я должен искать возможность программно добавить туда свое приложение?

Существует также метод

public abstract boolean isPowerSaveWhitelistApp (String packageName)

Которое, я думаю, должно быть доступным каким-то образом?! чтобы проверить, существует ли приложение в белом списке, и, возможно, в самом конце, надеюсь, пользователь ASK добавит его в белый список.

Итак, мой вопрос: кто-нибудь из вас пытался сделать что-то с лучшим результатом? Потому что я застрял, и я думаю, что это тупик.

для получения дополнительной информации: https://newcircle.com/s/post/1739/2015/06/12/diving-into-android-m-doze

4b9b3361

Ответ 1

Невозможно отключить оптимизацию батареи (= приложение белого списка для режима doze) без взаимодействия с пользователем на предварительном просмотре Android M.

Это можно сделать с помощью взаимодействия пользователя таким образом:

Intent intent = new Intent();
String packageName = context.getPackageName();
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
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));
}
context.startActivity(intent);

Ответ 2

Добавить разрешение

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

Ответ 3

Я думаю, что этот вспомогательный класс должен охватывать все ваши потребности.

Чтобы использовать его для запроса ОС в белый список вашего приложения, вы можете использовать prepareIntentForWhiteListingOfBatteryOptimization. Если вы получите null, это означает, что вам это не нужно, или что вы не можете его использовать. Вы можете использовать другую функцию для запроса лучшего состояния того, кем вы являетесь.

public class PowerSaverHelper {
    public enum PowerSaveState {
        ON, OFF, ERROR_GETTING_STATE, IRRELEVANT_OLD_ANDROID_API
    }

    public enum WhiteListedInBatteryOptimizations {
        WHITE_LISTED, NOT_WHITE_LISTED, ERROR_GETTING_STATE, UNKNOWN_TOO_OLD_ANDROID_API_FOR_CHECKING, IRRELEVANT_OLD_ANDROID_API
    }

    public enum DozeState {
        NORMAL_INTERACTIVE, DOZE_TURNED_ON_IDLE, NORMAL_NON_INTERACTIVE, ERROR_GETTING_STATE, IRRELEVANT_OLD_ANDROID_API, UNKNOWN_TOO_OLD_ANDROID_API_FOR_CHECKING
    }

    @NonNull
    public static DozeState getDozeState(@NonNull Context context) {
        if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP)
            return DozeState.IRRELEVANT_OLD_ANDROID_API;
        if (VERSION.SDK_INT < VERSION_CODES.M) {
            return DozeState.UNKNOWN_TOO_OLD_ANDROID_API_FOR_CHECKING;
        }
        final PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        if (pm == null)
            return DozeState.ERROR_GETTING_STATE;
        return pm.isDeviceIdleMode() ? DozeState.DOZE_TURNED_ON_IDLE : pm.isInteractive() ? DozeState.NORMAL_INTERACTIVE : DozeState.NORMAL_NON_INTERACTIVE;
    }

    @NonNull
    public static PowerSaveState getPowerSaveState(@NonNull Context context) {
        if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP)
            return PowerSaveState.IRRELEVANT_OLD_ANDROID_API;
        final PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        if (pm == null)
            return PowerSaveState.ERROR_GETTING_STATE;
        return pm.isPowerSaveMode() ? PowerSaveState.ON : PowerSaveState.OFF;
    }


    @NonNull
    public static WhiteListedInBatteryOptimizations getIfAppIsWhiteListedFromBatteryOptimizations(@NonNull Context context, @NonNull String packageName) {
        if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP)
            return WhiteListedInBatteryOptimizations.IRRELEVANT_OLD_ANDROID_API;
        if (VERSION.SDK_INT < VERSION_CODES.M)
            return WhiteListedInBatteryOptimizations.UNKNOWN_TOO_OLD_ANDROID_API_FOR_CHECKING;
        final PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        if (pm == null)
            return WhiteListedInBatteryOptimizations.ERROR_GETTING_STATE;
        return pm.isIgnoringBatteryOptimizations(packageName) ? WhiteListedInBatteryOptimizations.WHITE_LISTED : WhiteListedInBatteryOptimizations.NOT_WHITE_LISTED;
    }

    @TargetApi(VERSION_CODES.M)
    @RequiresPermission(permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
    @Nullable
    public static Intent prepareIntentForWhiteListingOfBatteryOptimization(@NonNull Context context, @NonNull String packageName, boolean alsoWhenWhiteListed) {
        if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP)
            return null;
        if (ContextCompat.checkSelfPermission(context, permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) == PackageManager.PERMISSION_DENIED)
            return null;
        final WhiteListedInBatteryOptimizations appIsWhiteListedFromPowerSave = getIfAppIsWhiteListedFromBatteryOptimizations(context, packageName);
        Intent intent = null;
        switch (appIsWhiteListedFromPowerSave) {
            case WHITE_LISTED:
                if (alsoWhenWhiteListed)
                    intent = new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
                break;
            case NOT_WHITE_LISTED:
                intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).setData(Uri.parse("package:" + packageName));
                break;
            case ERROR_GETTING_STATE:
            case UNKNOWN_TOO_OLD_ANDROID_API_FOR_CHECKING:
            case IRRELEVANT_OLD_ANDROID_API:
            default:
                break;
        }
        return intent;
    }

    /**
     * registers a receiver to listen to power-save events. returns true iff succeeded to register the broadcastReceiver.
     */
    @TargetApi(VERSION_CODES.M)
    public static boolean registerPowerSaveReceiver(@NonNull Context context, @NonNull BroadcastReceiver receiver) {
        if (VERSION.SDK_INT < VERSION_CODES.M)
            return false;
        IntentFilter filter = new IntentFilter();
        filter.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED);
        context.registerReceiver(receiver, filter);
        return true;
    }


}

Ответ 4

Насколько я знаю, вы не можете белыми списками от Doze. Игнорировать оптимизацию батареи не отключает дозу. См. Здесь: https://code.google.com/p/android-developer-preview/issues/detail?id=2225 ОБНОВЛЕНИЕ: в сборке релизов M вы можете запросить игнорировать оптимизацию батареи, которая, по крайней мере, даст вам нормальный доступ к Интернету в режиме Doze.

Ответ 5

Белый список может быть сделан программно. Чтобы добавить устройство в приложения из белого списка, выполните следующую команду из приложения:

adb shell dumpsys deviceidle whitelist +<package_name>

Чтобы удалить устройство из белого списка приложений, выполните следующую команду из приложения:

adb shell dumpsys deviceidle whitelist -<package_name>

Ответ 6

UPDATE

Когда устройство снова остановится, при выключенном и включенном батареях в течение определенного периода времени Doze применяет полные ограничения по ЦП и сети для аварийных сигналов PowerManager.WakeLock, AlarmManager и GPS/Wi-Fi.

Для более подробной информации посетите Использовать случаи для белого списка.

В приведенной ниже таблице указаны приемлемые варианты использования для запроса или находясь в белом списке исключений Battery Optimization. В целом, ваше приложение не должно быть в белом списке, если не требуется доза или ожидание приложения нарушить основную функцию приложения или есть техническая причина, по которой ваше приложение не может использовать высокоприоритетные сообщения GCM.

разработчик android n говорит

Doose, в частности, может повлиять на действия, которые управляют AlarmManager аварийными сигналами и , поскольку сигналы тревоги в Android 5.1 (уровень API 22) или ниже не срабатывают, когда система находится в Doze.

Android 6.0 (API-уровень 23) вводит два новых метода AlarmManager: setAndAllowWhileIdle() и setExactAndAllowWhileIdle(). С помощью этих методов вы можете установить аварийные сигналы, которые будут срабатывать, даже если устройство находится в режиме Doze.

Примечание. Ни setAndAllowWhileIdle(), ни setExactAndAllowWhileIdle() не могут запускать аварийные сигналы более одного раза в течение 15 минут на каждое приложение.

Тестирование с помощью Doze и App Standby