Forcer l'écran sur

115

Comment forcer l'écran à rester actif et à ne pas s'éteindre pendant que mon application est en cours d'exécution?

bugzy
la source
voir la réponse détaillée ici .. stackoverflow.com/questions/5712849/…
Zar E Ahmer

Réponses:

339

VEUILLEZ NE PAS UTILISER DE SERRURE DE RÉVEIL

Cela nécessite que vous donniez à votre application une autorisation supplémentaire, et il est très facile d'introduire des bogues où vous restez accidentellement en maintenant le verrou de réveil et laissez ainsi l'écran allumé.

Il est de loin, beaucoup mieux d'utiliser l'indicateur de fenêtre FLAG_KEEP_SCREEN_ON, que vous pouvez activer sur la fenêtre de votre activité dans votre onCreate()comme ceci:

@Override
protected void onCreate(Bundle icicle) {
    super.onCreate(icicle);

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

Cela garantira que l'écran reste allumé lorsque votre fenêtre est au premier plan, et uniquement lorsqu'elle est au premier plan. Cela simplifie considérablement ce cas d'utilisation courant, en éliminant toute jonglerie que vous devez faire lorsque votre application passe d'un état à l'autre.

hackbod
la source
5
Cela empêche-t-il l'appareil de dormir? Si tel est le cas, la banalité de WAKE_LOCK me semble une erreur choquante!
Michael Cramer
32
Oui, cela maintient l'écran allumé et empêche l'appareil de dormir.
hackbod
1
Oui, vous pouvez supprimer l'indicateur, avec l'API de fenêtre appropriée. Vous n'avez pas à vous soucier de faire dessiner quoi que ce soit, le framework le fait si nécessaire.
hackbod
1
@hakbod: cela fonctionnerait pour garder l'écran vivant, mais qu'en est-il de l'écran qui est endormi, cela le réveillerait-il et le garderait-il vivant ????
Kavitha
5
@ KC202, vous pouvez utiliser WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON pour que l'écran s'allume lorsque votre fenêtre est affichée. Également souvent utilisé avec FLAG_DISMISS_KEYGUARD et / ou FLAG_SHOW_WHEN_LOCKED.
hackbod
34

Cette question a déjà une excellente réponse de @hackbod!

Je réponds à cette question avec deux solutions supplémentaires!

Solution existante:

@Override
    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);    
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }

Solutions supplémentaires:

on peut utiliser keepScreenOn

1. implementation utilisationsetKeepScreenOn() in java code

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // or any View (in case generated programmatically ) 
        View v = getLayoutInflater().inflate(R.layout.driver_home, null);

        v.setKeepScreenOn(true);
        setContentView(v);
       }

Docs http://developer.android.com/reference/android/view/View.html#setKeepScreenOn(boolean)

2. Ajout keepScreenOnàxml layout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:keepScreenOn="true" >

Docs http://developer.android.com/reference/android/view/View.html#attr_android%3akeepScreenOn

Remarque (quelques points utiles):

1. peu importe qui keepScreenOndoit être utilisé dessus, Main/Root/Parent View il peut être utilisé avec n'importe quelchild view fonctionnera comme il fonctionne dansParent view

2. La seule chose qui compte, c'est que View's Visibility must be visiblesinon, cela ne fonctionnera pas!

Tarsem Singh
la source
la note v.setKeepScreenOn(true);semble être le seul moyen de le faire pour un fragment de dialogue en plein écran
Tim
16

Une autre solution consiste à ajouter android:keepScreenOn="true"(de la documentation ) aux vues qui doivent garder l'écran allumé.

Permet un contrôle un peu plus granulaire en ce qui concerne les vues qui restent et celles qui ne le sont pas. Vous pouvez même référencer un paramètre à partir d'un fichier de ressources de cette façon.

Alexandre Abramov
la source