Android: ¿Cómo encender y apagar la pantalla mediante programación?
Antes de marcar esta publicación como "duplicada", la escribo porque ninguna otra publicación contiene la solución al problema.
Estoy intentando apagar el dispositivo, luego de unos minutos o de cambiar el sensor, lo vuelvo a encender.
Desactivar las pruebas de visualización
Puedo apagar la pantalla usando:
params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = 0;
getWindow().setAttributes(params);
No he podido apagar la pantalla usando el método wl.release().
Activar la prueba de pantalla
Mi primera suposición, la siguiente, no funciona. No pasa nada, la pantalla permanece apagada.
params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = -1f;
getWindow().setAttributes(params);
Luego también intenté usar wakelocks, sin éxito.
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "tag");
wl.acquire();
Finalmente he probado lo siguiente, sin resultado.
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
Con todo, no recibo ningún tipo de error en la consola para ninguno de estos métodos. Mi texto de prueba "La pantalla debe estar encendida" aparece en la pantalla cuando enciendo el dispositivo con el botón de encendido. Esto muestra que el código debería haberse ejecutado. Responda solo si ha probado el código, parece que muchas de las funciones, como por ejemplo params.screenBrightness = -1
, no funcionan como deberían según el SDK.
Voy a asumir que usted sólo desea que esto esté vigente mientras su aplicación esté en primer plano.
Este código:
params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = 0;
getWindow().setAttributes(params);
No apaga la pantalla en el sentido tradicional. Hace que la pantalla sea lo más oscura posible. En la plataforma estándar hay un límite en cuanto a cuán tenue puede ser; Si su dispositivo realmente permite que la pantalla se apague por completo, entonces se trata de alguna peculiaridad de la implementación de ese dispositivo y no de un comportamiento con el que pueda contar en todos los dispositivos.
De hecho, usar esto junto con FLAG_KEEP_SCREEN_ON significa que nunca permitirá que la pantalla se apague (y, por lo tanto, que el dispositivo entre en modo de bajo consumo), incluso si el dispositivo en particular le permite configurar el brillo de la pantalla al máximo. Tenga esto muy en cuenta. Utilizará mucha más energía que si la pantalla estuviera realmente apagada.
Ahora, para volver la pantalla al brillo normal, basta con configurar el valor de brillo:
WindowManager.LayoutParams params = getWindow().getAttributes();
params.screenBrightness = -1;
getWindow().setAttributes(params);
No puedo explicar por qué esto no reemplazaría el valor 0 que había establecido anteriormente. Como prueba, podría intentar poner un brillo máximo forzado allí para forzar ese brillo específico:
WindowManager.LayoutParams params = getWindow().getAttributes();
params.screenBrightness = 1;
getWindow().setAttributes(params);
Esto definitivamente funciona. Por ejemplo, las aplicaciones de Libros de Google utilizan esto para permitirle ajustar el brillo de la pantalla para que se atenúe mientras usa un libro y luego volver al brillo normal cuando lo apaga.
Para ayudar a depurar, puede utilizar "adb shell dumpsys window" para ver el estado actual de su ventana. En los datos de su ventana, le indicará los LayoutParams actuales que se han configurado para ella. Asegúrese de que el valor que cree que realmente esté ahí.
Y nuevamente, FLAG_KEEP_SCREEN_ON es un concepto separado; éste y el brillo no tienen un impacto directo entre sí. (Y no habría razón para volver a configurar la bandera al deshacer el brillo, si ya la había configurado al poner el brillo a 0. La bandera permanecerá configurada hasta que la cambie).
Había escrito este método para encender la pantalla después del bloqueo de pantalla. Funciona perfectamente para mí. Intentalo-
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);
}
Y llame a este método desde onResume()
.
Yo sugeriría este:
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag");
wl.acquire();
La bandera ACQUIRE_CAUSES_WAKEUP se explica así:
Los bloqueos de activación normales en realidad no encienden la iluminación. En cambio, hacen que la iluminación permanezca encendida una vez que se enciende (por ejemplo, debido a la actividad del usuario). Esta bandera forzará a la pantalla y/o al teclado a encenderse inmediatamente, cuando se adquiera WakeLock. Un uso típico sería para notificaciones que es importante que el usuario vea de inmediato.
Además, asegúrese de tener el siguiente permiso en el archivo AndroidManifewst.xml:
<uses-permission android:name="android.permission.WAKE_LOCK" />