web-dev-qa-db-fra.com

Comment utiliser WhiteList en mode Doze Android 6.0

Cette question est liée à la Android 6.0 Preview 3 qui sera publié à la fin du mois.

Je teste certaines choses dans Android 6.0 dans l'aperçu 3 de Google sur Nexus 5 'hammerhead'.

La nouvelle fonctionnalité est le "mode assoupi" - quelque chose comme le mode de veille prolongée lorsque le réseau est désactivé et le téléphone en veille, seuls les SMS, les appels ou les messages GCM à priorité élevée peuvent le réactiver. Mais comme WhatsApp - dans le mode assoupi, il reçoit les messages après 2 heures ou plus dépend des minuteries. Mais il existe une liste d'applications "non optimisées" appelée "liste blanche" où vous pouvez ajouter manuellement une application.

Ok, j'aimerais trouver un moyen d'ajouter mon application par programme sans interaction de l'utilisateur à la "liste des applications de la liste blanche" qui existe dans l'appareil dans les paramètres de batterie.

En essayant d'utiliser la réflexion pour y entrer, j'ai trouvé:

Dans Android.os.IDeviceIdleController, il existe une méthode:

public abstract void addPowerSaveWhitelistApp (String packageNameOfApp)

Mais ceci est une interface ... Nous ne pouvons donc pas créer une instance d'interface.

Il n'y a pas encore de documentation sur cette interface ou sur les méthodes, ni d'arborescence d'héritage.

Peut-être avez-vous une idée de l'endroit où je devrais rechercher une possibilité d'ajouter par programme mon application?

Il y a aussi une méthode

public abstract boolean isPowerSaveWhitelistApp (String packageName)

Ce que je pense devrait être possible d'accéder en quelque sorte?! pour vérifier si l'application existe sur la liste blanche et peut-être à la fin espérons demander à l'utilisateur de l'ajouter à la liste blanche.

Donc ma question est, est-ce que quelqu'un d'entre vous a essayé de faire quelque chose avec un meilleur résultat? Parce que je suis coincé et je pense que c'est une impasse.

pour plus d'informations: https://newcircle.com/s/post/1739/2015/06/12/diving-into-Android-m-doze

48
Fransis Q

Ajouter une permission

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

demander la liste blanche de votre application

 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);
            }
        }
39
jefry jacky

Il n’est pas possible de désactiver les optimisations de batterie (= application de liste blanche pour le mode veille) sans interaction de l’utilisateur sur Android M preview 3.

Cela peut être fait avec l’interaction de l’utilisateur de cette façon:

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);
35
M66B

Je pense que cette classe d'assistance devrait couvrir tous vos besoins.

Pour l'utiliser afin de demander au système d'exploitation de mettre votre application en liste blanche, vous pouvez utiliser prepareIntentForWhiteListingOfBatteryOptimization. Si vous obtenez la valeur null, cela signifie que vous n'en avez pas besoin ou que vous ne pouvez pas l'utiliser. Vous pouvez utiliser l’autre fonction pour rechercher un meilleur état de vos résultats.

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


}
16
android developer

La liste blanche peut être faite par programme. Pour ajouter un appareil dans les applications de la liste blanche, exécutez la commande suivante à partir de l'application:

adb Shell dumpsys deviceidle whitelist +<package_name>

Pour supprimer un périphérique d'applications figurant sur la liste blanche, exécutez la commande suivante à partir de l'application:

adb Shell dumpsys deviceidle whitelist -<package_name>
6
Shinoo Goyal

Autant que je sache, vous ne pouvez pas vous inscrire sur la liste blanche de Doze. Ignorer les optimisations de batterie ne désactive pas la somnolence. Voir ici: https://code.google.com/p/Android-developer-preview/issues/detail?id=2225 MISE À JOUR: Dans la version de M, vous pouvez demander d'ignorer les optimisations de batterie. qui vous donnera au moins un accès normal à Internet en mode Doze.

4
A.Sanchez.SD

MISE À JOUR

Lorsque l'appareil est à nouveau immobile, avec l'écran éteint et la batterie pendant un certain temps, Doze applique les restrictions complètes du processeur et du réseau sur PowerManager.WakeLock, les alarmes AlarmManager et le GPS/Wi-Fi. scans .

Visitez Cas d’utilisation de la liste blanche pour plus de détails.

Le tableau ci-dessous présente les cas d'utilisation acceptables pour demander ou figurer sur la liste blanche des exceptions Optimisations de batterie. En règle générale, votre application ne doit pas figurer sur la liste blanche, à moins que Doze ou App Standby ne modifie la fonction principale de l'application ou en raison d'une raison technique empêchant votre application d'utiliser les messages de priorité élevée de GCM.

développeur Android n dit

Doze est particulièrement susceptible d’affecter les activités que AlarmManager alarmes et contrôlent les minuteries , parce que les alarmes dans Android 5.1 (niveau API 22) ou inférieur ne se déclenchent pas lorsque le système est dans Doze .

Android 6.0 (API niveau 23) introduit deux nouvelles méthodes AlarmManager: setAndAllowWhileIdle() et setExactAndAllowWhileIdle(). Avec ces méthodes, vous pouvez définir des alarmes qui se déclencheront même si le périphérique est à Doze.

Remarque : Ni setAndAllowWhileIdle() ni setExactAndAllowWhileIdle() ne peuvent déclencher des alarmes plus d'une fois toutes les 15 minutes par application.

Test avec Doze et App Standby

3
Amit Vaghela