Comment empêcher un appareil Android de se mettre en veille par programmation?

155

Comment empêcher un appareil Android de se mettre en veille par programmation?

James
la source

Réponses:

133

Une option consiste à utiliser un verrou de réveil . Exemple tiré de la documentation:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
wl.acquire();

// screen and CPU will stay awake during this section

wl.release();

Il y a aussi un tableau sur cette page qui décrit les différents types de wakelocks.

Sachez que certaines précautions doivent être prises lors de l'utilisation des verrous de réveil. Assurez-vous de toujours release()verrouiller lorsque vous en avez terminé (ou pas au premier plan). Sinon, votre application peut potentiellement provoquer une grave décharge de la batterie et une utilisation du processeur.

La documentation contient également une page utile qui décrit différentes approches pour garder un appareil éveillé, et quand vous pouvez choisir d'en utiliser une. Si «empêcher l'appareil de se mettre en veille» se réfère uniquement à l' écran (et ne pas maintenir le processeur actif), alors un verrouillage de réveil est probablement plus que ce dont vous avez besoin.

Vous devez également vous assurer que l' autorisation WAKE_LOCK est définie dans votre manifeste pour utiliser cette méthode.

eldarerathis
la source
21
Vous ne devriez plus l'utiliser car cette méthode est désormais obsolète. Jetez un œil à l'une des autres réponses.
DuKes0mE
4
Il y a encore quelques raisons d'utiliser wakelocks, comme si l'appareil est dédié à une application spécifique et doit fonctionner même lorsqu'il est réduit.
Muz
2
PowerManager.PARTIAL_WAKE_LOCK n'est pas obsolète et je pense que c'est la méthode la plus efficace. Il permet à l'utilisateur d'appuyer sur le bouton d'alimentation, mais le processeur restera allumé jusqu'à ce que l'utilisateur libère l'appel ();
Mansour Fahad
La documentation officielle indique: «Si vous avez besoin de maintenir le processeur en marche afin de terminer certains travaux avant que le périphérique ne se mette en veille, vous pouvez utiliser une fonction de service système PowerManager appelée verrouillage de réveil.
Joaquin Iurchuk
C'est un excellent moyen, mais il est obsolète. veuillez vérifier cette réponse: stackoverflow.com/a/22447615/5327912
Parth Anjaria
240

Si vous souhaitez simplement empêcher le mode veille sur un élément spécifique View, appelez- setKeepScreenOn(true)le simplement Viewou définissez la keepScreenOnpropriété sur true. Cela empêchera l'écran de s'éteindre tant que le Viewest à l'écran. Aucune autorisation spéciale requise pour cela.

Witek
la source
18
De plus, cela ne forcera pas le téléphone à rester éveillé en dehors de la durée de vie de l'application. Vous pouvez rencontrer ce problème avec WakeLock.
zzzzzzzzzzzzzzzzzzzzzzzzzzzz
2
Oui, dans la plupart des cas, c'est la meilleure approche.
Edward Falk
8
Cela devrait être la réponse choisie. Simple, propre et conforme à l'intention d'Android. Je vous remercie.
Lior Iluz
2
"Utiliser android: keepScreenOn =" true "équivaut à utiliser FLAG_KEEP_SCREEN_ON. Vous pouvez utiliser l'approche qui convient le mieux à votre application. L'avantage de définir l'indicateur par programmation dans votre activité est que cela vous donne la possibilité d'effacer l'indicateur par programme ultérieurement et permettant ainsi à l'écran de s'éteindre "- developer.android.com/training/scheduling/wakelock.html
Antonino
Notez que le setKeepScreenOn(true)ne prendra effet que lorsqu'il Viewest visible.
Jeff
121

J'ai trouvé une autre solution de travail: ajoutez la ligne suivante à votre application sous l'événement onCreate.

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

Mon exemple de projet Cordova ressemble à ceci:

package com.apps.demo;
import android.os.Bundle;
import android.view.WindowManager;
import org.apache.cordova.*;

public class ScanManActivity extends DroidGap {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        super.loadUrl("http://stackoverflow.com");
    }
}

Après cela, mon application ne s'endormit plus tant qu'elle était ouverte. Merci pour la réponse à xSus.

dogatonique
la source
c'était la meilleure option à mon avis ... +1
Amit
Cela fait la même chose que la réponse de Witek, la seule différence est que vous mettez cela dans un fichier ".java" au lieu d'un fichier ".xml" ;-)
tiktak
Et la permission? Faut-il une autorisation?
Mehdi Khademloo
@Mehdi Khademloo il n'a pas besoin de permission.
Wessam El Mahdy
17

Définissez des indicateurs sur la fenêtre d'activité comme ci-dessous

@Override public void onResume() {
 super.onResume();
 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

@Override public void onPause() {
 super.onPause();
 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
Arjun
la source
6

Depuis le shell racine (par exemple le shell adb), vous pouvez verrouiller avec:

echo mylockname >/sys/power/wake_lock    

Après quoi, l'appareil restera éveillé jusqu'à ce que vous:

echo mylockname >/sys/power/wake_unlock    

Avec la même chaîne pour 'mylockname'.

Notez que cela n'empêchera pas l'écran de devenir noir, mais cela empêchera le processeur de dormir.

Notez que / sys / power / wake_lock est en lecture-écriture pour la radio utilisateur (1001) et le système de groupe (1000), et, bien sûr, root.

Une référence est ici: http://lwn.net/Articles/479841/

jelle foks
la source
3

ce que @eldarerathis a dit est correct dans tous les aspects, le verrouillage de réveil est le bon moyen d'empêcher l'appareil de s'endormir.

Je ne sais pas ce que votre application doit faire, mais il est vraiment important que vous réfléchissiez à la façon dont votre application doit être conçue pour ne pas forcer le téléphone à rester éveillé pendant plus que ce dont vous avez besoin, sinon la durée de vie de la batterie en souffrira énormément.

Je vous indiquerais ce très bon exemple sur la façon d'utiliser AlarmManagerpour déclencher des événements et réveiller le téléphone et (votre application) pour effectuer ce que vous devez faire, puis vous rendormir : Alarm Manager (source: commonsware.com)

lucabox
la source
Il existe des applications utilitaires spécifiquement et délibérément destinées à vider la batterie. J'en ai eu besoin pour une fois. Fondamentalement, il acquiert des wakelocks, vibre comme un fou, allume la lampe de poche, augmente la luminosité, etc. Alors oui, il y a des applications qui utilisent cela. Mais ce n'était pas le sujet alors pardonnez-moi
TheRealChx101
0

Si vous êtes un utilisateur Xamarin, voici la solution:

   protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle); //always call superclass first

        this.Window.AddFlags(WindowManagerFlags.KeepScreenOn);

        LoadApplication(new App());
    }
hogarth45
la source