para - manual de programacion android pdf
Android: ¿Cómo activar y desactivar la pantalla mediante programación? (11)
Antes de marcar esta publicación como un "duplicado", escribo esta publicación porque ninguna otra publicación contiene la solución al problema.
Estoy tratando de apagar el dispositivo, luego de unos minutos o de que el sensor cambie, vuelva a encenderlo.
Desactivar pruebas de pantalla
Puedo apagar la pantalla usando:
params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = 0;
getWindow().setAttributes(params);
No he podido apagar la pantalla con el método wl.release ().
Activar prueba de pantalla
Mi primera suposición, de la siguiente manera, no funciona. No pasa nada, la pantalla permanece apagada.
params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = -1f;
getWindow().setAttributes(params);
También intenté usar wakelocks, sin éxito.
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "tag");
wl.acquire();
Finalmente, he intentado lo siguiente, sin resultado.
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
En general, no obtengo ningún tipo de error en la consola por ninguno de estos métodos. Mi texto de prueba "La pantalla debe estar encendida", aparece en la pantalla cuando enciendo el dispositivo usando el botón de encendido. Esto muestra que el código debería haberse ejecutado. Solo responda si ha probado el código, parece que muchas de las funciones, como params.screenBrightness = -1
, no funcionan como deberían según el sdk.
¿Seguro que solicitó el permiso correspondiente en su archivo Manifest?
<uses-permission android:name="android.permission.WAKE_LOCK" />
Puede utilizar la clase AlarmManager 1 para activar un intento que comience su actividad y adquiera el bloqueo de activación. Esto encenderá la pantalla y la mantendrá encendida. Liberar el wakelock permitirá que el dispositivo se vaya a dormir por sí mismo.
También puede consultar el uso de PowerManager para configurar el dispositivo en modo de suspensión: http://developer.android.com/reference/android/os/PowerManager.html#goToSleep(long)
En cuanto a la documentación de Android, se puede lograr utilizando la siguiente línea de código:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
He agregado esto en mi método onCreate
y funciona bien.
En el enlace, encontrará diferentes formas de lograr esto y una explicación general también.
Enlace a la documentación: https://developer.android.com/training/scheduling/wakelock.html
Este es un ejemplo exitoso de una implementación de la misma cosa, en un dispositivo que admite valores de brillo de pantalla más bajos (lo probé en una tableta Allwinner Chinese de 7 "que ejecuta 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 alguien más lo prueba, por favor comente abajo si funcionó / no funcionó y el dispositivo, Android API.
Había escrito este método para encender la pantalla después de bloquear la 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()
.
Hola, espero que esto ayude:
private PowerManager mPowerManager;
private PowerManager.WakeLock mWakeLock;
public void turnOnScreen(){
// turn on screen
Log.v("ProximityActivity", "ON!");
mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag");
mWakeLock.acquire();
}
@TargetApi(21) //Suppress lint error for PROXIMITY_SCREEN_OFF_WAKE_LOCK
public void turnOffScreen(){
// turn off screen
Log.v("ProximityActivity", "OFF!");
mWakeLock = mPowerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "tag");
mWakeLock.acquire();
}
La mejor forma de hacerlo (usando dispositivos rooteados):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
.
.
.
int flags = WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
getWindow().addFlags(flags); // this is how your app will wake up the screen
//you will call this activity later
.
.
.
}
Ahora tenemos estas dos funciones:
private void turnOffScreen(){
try{
Class c = Class.forName("android.os.PowerManager");
PowerManager mPowerManager = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
for(Method m : c.getDeclaredMethods()){
if(m.getName().equals("goToSleep")){
m.setAccessible(true);
if(m.getParameterTypes().length == 1){
m.invoke(mPowerManager,SystemClock.uptimeMillis()-2);
}
}
}
} catch (Exception e){
}
}
Y esto:
public void turnOnScreen(){
Intent i = new Intent(this,YOURACTIVITYWITHFLAGS.class);
startActivity(i);
}
Perdón por mi mal ingles.
No tendría la esperanza de "despertar la pantalla" en la actividad. Si la pantalla está apagada, la actividad probablemente se encuentre en estado de pausa y no debería estar ejecutando ningún código.
Al despertar, está el problema de la pantalla de bloqueo. No sé cómo cualquier aplicación puede omitir automáticamente la pantalla de bloqueo.
Debería considerar ejecutar sus tareas en segundo plano en un servicio y luego usar el administrador de notificaciones para enviar una notificación cuando se detecte lo que sea. La notificación debe proporcionar algún tipo de alerta de dispositivo (activación de la pantalla, icono de notificación, aviso dirigido, etc.). Al hacer clic en la notificación, puede iniciar la intención de comenzar su actividad.
También podría intentar iniciar la actividad directamente desde el servicio, pero realmente no sé si eso encenderá la pantalla o saltará la pantalla de bloqueo.
Para mantener la pantalla encendida:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
Volver al modo predeterminado de la pantalla: simplemente borre la bandera FLAG_KEEP_SCREEN_ON
getWindow().clearFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
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, desde la actividad del usuario). Esta bandera forzará a la pantalla y / o teclado a encenderse inmediatamente, cuando se adquiere WakeLock. Un uso típico sería para notificaciones que son importantes para 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" />
Voy a suponer que solo quieres que esto tenga efecto mientras tu 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 tenue posible. En la plataforma estándar, existe un límite de cuán tenue puede ser; si su dispositivo realmente permite que la pantalla se apague por completo, entonces es una peculiaridad de la implementación de ese dispositivo y no 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 el dispositivo pase al modo de bajo consumo de energía) incluso si el dispositivo en particular le permite ajustar el brillo de la pantalla a apagado total. Ten esto muy en cuenta. Utilizará mucha más energía de la que tendría si la pantalla estuviera realmente apagada.
Ahora, para volver la pantalla al brillo normal, basta con configurar el valor de brillo para hacerlo:
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 previamente. Como prueba, podrías intentar poner un brillo completo 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 usan esto para permitirte ajustar el brillo de la pantalla para atenuarse mientras usas un libro y luego volver a un brillo regular cuando lo apagas.
Para ayudar a depurar, puede utilizar "ventana de dumpyshell adb" para ver el estado actual de su ventana. En los datos de su ventana, le dirá los LayoutsParams actuales que se han establecido para él. Asegúrate de que el valor que piensas está realmente allí.
Y nuevamente, FLAG_KEEP_SCREEN_ON es un concepto separado; él y el brillo no tienen un impacto directo en el otro. (Y no habría ninguna razón para volver a establecer la bandera al deshacer el brillo, si ya lo había configurado al poner el brillo en 0. La bandera permanecerá activada hasta que la cambie).
WakeLock screenLock = ((PowerManager)getSystemService(POWER_SERVICE)).newWakeLock(
PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");
screenLock.acquire();
//later
screenLock.release();
// archivo de manifiesto de usuario