Android deshabilita el tiempo de espera de la pantalla mientras la aplicación se está ejecutando

Respuestas:

173

Quieres usar algo como esto:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
Ian G. Clifton
fuente
4
¿Esto lo hace para la actividad de correr o para toda la aplicación?
Muhammed Refaat
@ MayurR.Amipara sí, creo que este es el caso aquí
Muhammed Refaat
1
Si escribo este código en el método onCreate () de la clase de aplicación, ¿funcionará para toda la aplicación?
Jayesh
Si la respuesta es No, ¿cómo puedo mantener encendida toda la pantalla de la aplicación insertando menos código en lugar de agregar esa línea a cada una de las actividades?
Jayesh
1
@Jayesh: Puede crear una baseActivity y escribir este código en el método onCreate y extender toda la actividad desde baseActivity.
maryam
102

Solía:

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

para deshabilitar el tiempo de espera de la pantalla y

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

para volver a habilitarlo.

capellone78
fuente
84

También hay una forma XML que recomienda Google:

<LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:keepScreenOn="true">

Consulte Presentaciones de Google - Diapositiva 16.

"Los Wakelocks son costosos si se olvidan (...) Considere usar android: keepScreenOn para garantizar la corrección"

Neteinstein
fuente
2
Para aquellos que no tienen tiempo para leer el pdf vinculado: "Los Wakelocks son costosos si se olvidan", "Considere usar android: keepScreenOn para garantizar la corrección".
lenrok258
2
@ lenrok258 Agregado a la respuesta ;-)
neteinstein
Mientras usaba PowerManager.newWakeLocky getWindow().addFlagsno funcionó por alguna razón, esto sí lo hizo.
Benjamin Basmaci
3

Simplemente agregue la línea de abajo en su MainActivityy su aplicación nunca apague las luces.

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
Excepción de puntero nulo
fuente
2

En una vista, en mi caso una subclase de SurfaceView, puede configurar la pantalla siempre encendida. Quería que la pantalla permaneciera encendida mientras esta vista todavía dibujaba cosas.

public class MyCoolSurfaceView extends SurfaceView { 
@Override
protected void onAttachedToWindow (){
    super.onAttachedToWindow();
    this.setKeepScreenOn(true);
}

@Override
protected void onDetachedFromWindow(){
    super.onDetachedFromWindow();
    this.setKeepScreenOn(false);
}
Orkoden
fuente
1
En realidad, eso es más complicado de lo necesario. Simplemente llame a setKeepsScreenOn (verdadero) en cualquier lugar, y el marco se encargará automáticamente de mantener la pantalla encendida cuando se muestre su ventana.
hackbod
1

Pon esto en onStart

    PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "no sleep");
    wakeLock.acquire();

Y esto en ti manifiesta

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

No te olvides de

wakeLock.release();

en onStop

Gonkas
fuente
1
PARTIAL_WAKE_LOCKpermite que la pantalla se apague.
Michael
1

esta es la mejor manera de resolver esto

 getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
MBMJ
fuente
¿Por qué es necesario que FLAG_FULLSCREEN responda a esta pregunta?
Abdul Wasae
0
procedure SetSleep(aEnable:Boolean);
var
    vFlags: integer;
begin
    vFlags := TJWindowManager_LayoutParams.JavaClass.FLAG_TURN_SCREEN_ON or
        TJWindowManager_LayoutParams.JavaClass.FLAG_DISMISS_KEYGUARD or
        TJWindowManager_LayoutParams.JavaClass.FLAG_SHOW_WHEN_LOCKED or
        TJWindowManager_LayoutParams.JavaClass.FLAG_KEEP_SCREEN_ON;

    if aEnable then
    begin
      CallInUIThread (   // uses FMX.Helpers.Android
      procedure
      begin
        TAndroidHelper.Activity.getWindow.setFlags (vFlags, vFlags);
      end );
    end
    else
      CallInUIThread (
      procedure
      begin
        TAndroidHelper.Activity.getWindow.clearFlags (vFlags);
      end );
end;
Artur Majtczak
fuente
0

1.getWindow (). AddFlags (WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); es la mejor solución para Android nativo.
2. Si desea hacerlo con la aplicación de Android React, utilice el siguiente código.

@ReactMethod
    public void activate() {
        final Activity activity = getCurrentActivity();
        if (activity != null) {
            activity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
                }
            });
        }

    }
Manisha
fuente
-1

Esto se puede hacer adquiriendo un Wake Lock.

No lo probé yo mismo, pero aquí hay un pequeño tutorial sobre esto.

wonne
fuente
10
No no no. Las cerraduras de activación se utilizan fácilmente y pueden agotar la batería del usuario si no se utilizan con mucho cuidado. Use View#setKeepScreenOno su atributo de diseño xml equivalente,android:keepScreenOn="true"
adamp
5
@adamp: El OP no indicó si su aplicación es una actividad o un servicio. Una actividad debe utilizar el mecanismo que cita. Un servicio debe utilizar un WakeLock.
CommonsWare
gracias no es un servicio. es similar a un visor de imágenes y no quiero que la pantalla se atenúe.
pinza
@adamp: tu mención de android:keepScreenOn="true"es la única respuesta válida para actividades en mi opinión. Manténgase alejado de los wakelocks a menos que sea absolutamente necesario.
pauluss86
No solo actividades, sino cualquier tipo de interfaz de usuario que muestre una ventana. La respuesta aceptada de usar la bandera de ventana correspondiente es igualmente válida.
adamp