53 votes

Comment faire fonctionner un WakeLock Android ?

Mon WakeLock ne garde pas mon appareil éveillé.

Sur OnCreate() J'en ai :

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, "My Tag");
mWakeLock.acquire();

alors :

new CountDownTimer(1320000, 200) {

    public void onTick(long millisUntilFinished) {
        // I update a progress bar here.                                         
    }

    public void onFinish() {
        // I finish updating the progress bar.
        mWakeLock.release();
    }
}.start();

L'écran s'éteint avant la fin de la minuterie, comment puis-je faire en sorte que l'écran reste visible ?

mWakeLock est un champ préalablement déclaré comme suit :

private PowerManager.WakeLock mWakeLock;

Mon appareil utilise Android 1.6. J'apprécierais vraiment toute aide pour résoudre ce problème.

110voto

AndroidKid Points 3330

WakeLock ne cause généralement pas de problèmes de redémarrage. Il peut y avoir d'autres problèmes dans votre codage. WakeLock monopolise la batterie de manière importante, s'il n'est pas libéré après utilisation.

WakeLock est un moyen inefficace de garder l'écran allumé. Utilisez plutôt le WindowManager pour faire la magie. La ligne suivante suffira pour le WakeLock. L'autorisation WakeLock est également nécessaire pour que cela fonctionne. Ce code est également plus efficace que le wakeLock.

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

Vous n'avez pas besoin de libérer le WakeLock manuellement. Ce code permettra au système Android de gérer le verrouillage automatiquement. Lorsque votre application est au premier plan, le WakeLock est maintenu et le système Android libère le verrou automatiquement.

Essayez ceci et postez votre commentaire...

0 votes

Je ne pense pas que vous ayez besoin de la permission de verrouillage du réveil pour le faire à la manière de WindowManager.

0 votes

WOW ! J'ai utilisé le powermanager pour acquérir le wakelock dans beaucoup d'applications, ce qui m'a donné beaucoup de problèmes ! C'est un moyen beaucoup plus efficace ! Merci @AndroidKid !

0 votes

Oui, mais FLAG_KEEP_SCREEN_ON permet-il d'atténuer l'écran ?

50voto

wf. Points 758

Avez-vous les compétences requises autorisation dans votre manifeste ?

<uses-permission android:name="android.permission.WAKE_LOCK" />

0 votes

En effet. Vérifiez votre sortie logcat au moment où vous appelez le wakelock. Le système vous avertit généralement des permissions manquantes.

0 votes

J'ai bien défini ces autorisations, et le système d'exploitation Android les mentionne lorsque j'installe l'application.

1 votes

Je ne fais que deviner, mais une autre chose à vérifier est qu'au moment où vous avez créé le wake lock, l'écran ne s'est pas déjà éteint. Car acquire() ne garantit que la préservation/restauration de l'état d'alimentation au moment où le wake lock a été créé. Après tout : d'après la description de votre problème, nous ne pouvons pas être sûrs que l'écran était encore allumé/visible au moment où vous avez appelé CountDownTimer.start().

24voto

Maverick Points 1072

Tu dois juste écrire ça :

 private PowerManager.WakeLock wl;

    protected void onCreate(Bundle savedInstanceState) {
               super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "DoNjfdhotDimScreen");
    }//End of onCreate

            @Override
        protected void onPause() {
            super.onPause();
            wl.release();
        }//End of onPause

        @Override
        protected void onResume() {
            super.onResume();
            wl.acquire();
        }//End of onResume

et ensuite ajouter la permission dans le fichier manifeste

 <uses-permission android:name="android.permission.WAKE_LOCK" />

Maintenant, votre activité sera toujours en éveil. Vous pouvez faire d'autres choses comme w1.release() selon vos besoins.

6voto

Sunil Kumar Sahoo Points 21032

Pour réaliser le même programme, vous pouvez utiliser les éléments suivants

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

ou l'ajout de ce qui suit dans la mise en page permettra également d'effectuer la tâche ci-dessus

 android:keepScreenOn="true"

Les détails peuvent être obtenus à partir de l'url suivante http://developer.Android.com/training/scheduling/wakelock.html

J'ai utilisé les combinaisons suivantes pour réveiller mon écran lorsque le clavier est verrouillé et garder mon écran allumé.

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);

2voto

Brock Tice Points 21

J'ai un problème similaire. Je peux faire en sorte que l'écran reste allumé, mais si j'utilise un verrouillage de réveil partiel et que l'écran est éteint, ma fonction onFinish n'est pas appelée avant que l'écran ne soit allumé.

Vous pouvez vérifier votre verrou de réveil en utilisant mWakeLock.isHeld(), tout d'abord, pour vous assurer que vous l'obtenez. Le plus simple est d'ajouter cette fonction au code, de définir un point d'arrêt dans le débogueur, puis de vérifier.

Dans mon cas, je l'obtiens, mais le verrouillage de réveil partiel ne semble rien faire. Voici mon code de travail pour le verrouillage de l'écran.

protected void setScreenLock(boolean on){
        if(mWakeLock == null){
            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK |
                                        PowerManager.ON_AFTER_RELEASE, TAG);
        }
        if(on){
         mWakeLock.acquire();
        }else{
            if(mWakeLock.isHeld()){
                mWakeLock.release();
            }
         mWakeLock = null;
        }

    }

ADDENDUM :

Les utilisateurs de Droid Eris et DROID me signalent que cela ne fonctionne PAS sur leurs appareils, alors que cela fonctionne bien sur mon G1. Sur quel appareil faites-vous vos tests ? Je pense que c'est peut-être un bug d'Android.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X