111 votes

Android : Comment allumer et éteindre l'écran de manière programmatique ?

Avant de marquer ce post comme un "duplicate", j'écris ce post parce qu'aucun autre post ne détient la solution au problème.

J'essaie d'éteindre l'appareil, puis de le rallumer après quelques minutes ou un changement de capteur.

Désactiver les tests d'affichage

Je suis capable d'éteindre l'écran en utilisant :

params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = 0;
getWindow().setAttributes(params);

Je n'ai pas réussi à éteindre l'écran en utilisant la méthode wl.release().

Test d'allumage de l'écran

Ma première hypothèse, comme suit, ne fonctionne pas. Rien ne se passe, l'écran reste éteint.

params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = -1f;
getWindow().setAttributes(params);

J'ai également essayé d'utiliser les wakelocks, sans succès.

PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "tag");
wl.acquire();

Enfin, j'ai essayé ce qui suit, sans résultat.

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

Dans l'ensemble, je n'obtiens aucun type d'erreur dans la console pour aucune de ces méthodes. Le texte de test "Screen should be on" s'affiche à l'écran lorsque j'allume l'appareil à l'aide du bouton d'alimentation. Cela montre que le code aurait dû être exécuté. Veuillez ne répondre que si vous avez testé le code. Il semble que de nombreuses fonctions telles que params.screenBrightness = -1 ne fonctionnent pas comme ils le devraient selon le SDK.

1 votes

Votre méthode pour éteindre l'écran n'a pas fonctionné pour moi. Vous avez activé le drapeau pour que l'écran reste allumé en permanence, ce qui consomme de l'énergie.

0 votes

Vous avez trouvé la solution ? Il y a quelques applications sur le PlayStore qui suggèrent de le faire. J'ai essayé celle-ci et elle fonctionne mais elle demande l'administration du dispositif. play.google.fr/store/apps/

0 votes

Avez-vous trouvé quelque chose dans ce problème ? !!

71voto

hackbod Points 55292

Je vais supposer que vous ne voulez que cela soit effectif que lorsque votre application est au premier plan.

Ce code :

params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = 0;
getWindow().setAttributes(params);

N'éteint pas l'écran au sens traditionnel du terme. Il rend l'écran aussi faible que possible. Dans la plate-forme standard, il y a une limite à l'intensité de l'écran. Si votre appareil permet à l'écran de s'éteindre complètement, il s'agit d'une particularité de l'implémentation de cet appareil et non d'un comportement sur lequel vous pouvez compter sur tous les appareils.

En fait, l'utilisation de ce paramètre en conjonction avec FLAG_KEEP_SCREEN_ON signifie que vous ne permettrez jamais à l'écran de s'éteindre (et donc à l'appareil de passer en mode de faible consommation), même si l'appareil en question vous permet de régler la luminosité de l'écran à zéro. Gardez bien ceci à l'esprit. Vous utiliserez beaucoup plus d'énergie que si l'écran était vraiment éteint.

Pour rétablir la luminosité normale de l'écran, il suffit de régler la valeur de la luminosité :

WindowManager.LayoutParams params = getWindow().getAttributes();
params.screenBrightness = -1;
getWindow().setAttributes(params);

Je ne peux pas expliquer pourquoi cela ne remplacerait pas la valeur 0 que vous aviez précédemment définie. En guise de test, vous pouvez essayer de mettre une luminosité complète forcée pour forcer cette luminosité spécifique :

WindowManager.LayoutParams params = getWindow().getAttributes();
params.screenBrightness = 1;
getWindow().setAttributes(params);

Cela fonctionne vraiment. Par exemple, l'application Livres de Google l'utilise pour vous permettre de régler la luminosité de l'écran sur faible pendant l'utilisation d'un livre, puis de revenir à la luminosité normale lorsque vous l'éteignez.

Pour faciliter le débogage, vous pouvez utiliser "adb shell dumpsys window" pour voir l'état actuel de votre fenêtre. Dans les données de votre fenêtre, vous trouverez les LayoutParams actuels qui ont été définis pour elle. Vérifiez que la valeur à laquelle vous pensez est bien présente.

Et encore une fois, FLAG_KEEP_SCREEN_ON est un concept distinct ; il n'a aucun impact direct sur la luminosité. (Et il n'y aurait aucune raison d'activer à nouveau le drapeau en annulant la luminosité, si vous l'aviez déjà activé en mettant la luminosité à 0. Le drapeau restera activé jusqu'à ce que vous le changiez).

10 votes

Existe-t-il un meilleur moyen d'éteindre l'écran ?

0 votes

Comme @hackbod l'a indiqué ci-dessus, "params.screenBrightness = 0 ;" n'éteint pas complètement l'écran, mais le rend aussi faible que possible. Et "params.screenBrightness = -1 ;" ramène l'écran à son niveau de luminosité précédent. Cependant, dans certains cas, il est nécessaire d'éteindre complètement l'écran. Il existe peut-être d'autres méthodes...

6 votes

Quelles seraient ces autres méthodes qui éteignent réellement l'écran plutôt que de simplement régler la luminosité minimale qui peut ou non fonctionner ?

38voto

Rajkiran Points 2354

J'avais écrit cette méthode pour allumer l'écran après le verrouillage de l'écran. Elle fonctionne parfaitement pour moi. Essayez-la.

    private void unlockScreen() {
        Window window = this.getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
        window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
        window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    }

Et appelez cette méthode à partir de onResume() .

1 votes

Pas utile si vous prévoyez d'allumer l'écran lorsque vous voulez mettre fin à l'activité.

7 votes

Eh bien, je vous suggère de ne pas utiliser ma méthode car elle n'a pas fonctionné pour moi sur Micromax Canvas2+. Utilisez ce lien à la place.

30voto

ramdroid Points 1688

Je suggère celui-ci :

PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag");
wl.acquire();

Le drapeau ACQUIRE_CAUSES_WAKEUP s'explique ainsi :

Les verrous de réveil normaux n'allument pas réellement l'éclairage. Au contraire, ils font en sorte que l'éclairage reste allumé une fois qu'il s'est allumé (par exemple, à cause de l'activité de l'utilisateur). Cet indicateur forcera l'écran et/ou le clavier à s'allumer immédiatement, lorsque le WakeLock est acquis. Une utilisation typique pour les notifications qu'il est important pour l'utilisateur de voir immédiatement. immédiatement.

Vérifiez également que vous disposez des autorisations suivantes dans le fichier AndroidManifewst.xml :

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

5 votes

Malheureusement, l'indicateur SCREEN_BRIGHT_WAKE_LOCK a été déprécié.

6voto

Zambotron Points 416

Êtes-vous sûr d'avoir demandé la permission appropriée dans votre fichier Manifest ?

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

Vous pouvez utiliser le AlarmManager 1 pour déclencher une intention qui lance votre activité et acquiert le verrou de réveil. L'écran s'allume alors et reste allumé. La libération du verrou de réveil permettra à l'appareil de se mettre en veille de lui-même.

Vous pouvez également envisager d'utiliser le PowerManager pour mettre l'appareil en veille : http://developer.Android.com/reference/Android/os/PowerManager.html#goToSleep(long)

1 votes

Merci pour la réponse. Oui, je suis sûr. Il est dans mon manifeste et il n'y a pas d'erreurs de débogage. AlarmManager ne m'aide pas lorsque j'utilise des capteurs pour allumer l'écran. Je n'ai pas eu beaucoup de chance avec goToSleep, mais cela ne m'aide toujours pas à allumer l'écran. Je suis actuellement capable d'éteindre l'écran.

4voto

ılǝ Points 1597

Voici un exemple réussi d'une mise en œuvre de la même chose, sur un appareil supportant des valeurs de luminosité d'écran plus faibles (j'ai testé sur une tablette chinoise Allwinner de 7 pouces fonctionnant sous API15).

WindowManager.LayoutParams params = this.getWindow().getAttributes();

/** Turn off: */
params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
//TODO Store original brightness value
params.screenBrightness = 0.1f;
this.getWindow().setAttributes(params);

/** Turn on: */
params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
//TODO restoring from original value
params.screenBrightness = 0.9f;
this.getWindow().setAttributes(params);

Si quelqu'un d'autre essaie cette méthode, veuillez indiquer ci-dessous si elle a fonctionné ou non, ainsi que l'appareil et l'API Android.

2 votes

Sur mon appareil, nexus 7, cela ne fonctionne pas bien, l'écran est toujours allumé, juste un peu plus sombre, mais pas complètement noir.

0 votes

Cette implémentation ne devrait pas être utilisée pour une version publique, bien qu'elle puisse servir à l'intégration d'un appareil spécifique. Je vais garder le post car il pourrait aider quelqu'un pour la suite.

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