android - pin - smart lock samsung
Android-Activar y desbloquear dispositivo (1)
Resolví el problema. La razón por la que observamos un comportamiento diferente cuando se conectó el dispositivo a través de USB fue porque la CPU del dispositivo no iba a dormir. Supongo que esto es un resultado de la configuración del modo de depuración, o simplemente cómo se comporta cuando se conecta a una computadora, ya que la función de ahorro de energía del apagado de la CPU sería irrelevante. Obviamente, cuando el dispositivo no está enchufado, la CPU felizmente tomaría una siesta y, aunque observamos que la aplicación se ejecutaba al azar (se activaría a sí misma en momentos aleatorios), el tiempo sería inconsistente. Además, asumo que esto se debe a que los pocos ciclos de CPU que se produjeron se asignan con moderación, y nuestra aplicación recibiría muy pocos ciclos en momentos "aleatorios".
Por lo tanto, nuestra solución fue obtener un bloqueo de onPause
parcial cuando el dispositivo entra en segundo plano (que se realiza en el método onPause
) y liberar el bloqueo en el método onResume
. Esto parece evitar que la CPU duerma. Continuamos utilizando el bloqueo de activación total y la desactivación del bloqueo del teclado para activar el dispositivo cuando lo necesitemos. El uso del bloqueo de activación parcial parece impedir que la CPU entre en suspensión, y parece que el dispositivo se activa correctamente cuando se espera. Aquí está nuestro código actualizado, en caso de que alguien se encuentre con este problema:
// Called from onCreate
protected void createWakeLocks(){
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
fullWakeLock = powerManager.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "Loneworker - FULL WAKE LOCK");
partialWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Loneworker - PARTIAL WAKE LOCK");
}
// Called implicitly when device is about to sleep or application is backgrounded
protected void onPause(){
super.onPause();
partialWakeLock.acquire();
}
// Called implicitly when device is about to wake up or foregrounded
protected void onResume(){
super.onResume();
if(fullWakeLock.isHeld()){
fullWakeLock.release();
}
if(partialWakeLock.isHeld()){
partialWakeLock.release();
}
}
// Called whenever we need to wake up the device
public void wakeDevice() {
fullWakeLock.acquire();
KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
KeyguardLock keyguardLock = keyguardManager.newKeyguardLock("TAG");
keyguardLock.disableKeyguard();
}
Descripción de la aplicación: la aplicación está diseñada como un programa de seguridad para un cliente específico (no se implementará públicamente). Cuando la aplicación no ha detectado movimiento durante un cierto período de tiempo, la aplicación debe hacer sonar una alarma y aparecer en primer plano si está en segundo plano o el dispositivo está en reposo.
El problema: en caso de que el dispositivo esté inactivo y bloqueado, debemos despertarlo y desbloquearlo. Al usar varias técnicas que se encuentran aquí en SO y otros lugares, hemos podido (parcialmente) activar y desbloquear el dispositivo, sin embargo, esto SOLO se comporta correctamente cuando el dispositivo está físicamente conectado a una computadora. Si el dispositivo está sentado solo desenchufado, y probamos el desbloqueo despertador, no sucede nada; El dispositivo parece permanecer dormido y la aplicación parece no hacer nada (sin alarma).
He utilizado esta publicación sobre el uso de PowerManager y KeyguardManager , y esta publicación utilizando indicadores de ventana.
Aquí está el código actualmente utilizado para activar el dispositivo:
public void wakeDevice() {
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "TAG");
wakeLock.acquire();
KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
KeyguardLock keyguardLock = keyguardManager.newKeyguardLock("TAG");
keyguardLock.disableKeyguard();
runOnUiThread(new Runnable(){
public void run(){
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
}
});
}
A partir de los comentarios y publicaciones en algunas de las otras preguntas de SO que he visto / usado, parece que el código de PowerManager / KeyguardManager debería haber hecho el truco. Una vez más, como dije antes, técnicamente funciona mientras el dispositivo está conectado a través de USB a la máquina dev, pero no hace absolutamente nada mientras el dispositivo está separado.
Además, tenga en cuenta que esta es nuestra primera aplicación de Android, y por eso somos plenamente conscientes de que podríamos estar completamente equivocados en lo que estamos tratando de hacer. Cualquier sugerencia es bienvenida.
En resumen, dado el código anterior, ¿por qué el dispositivo se comporta de manera tan diferente según si está conectado, y qué debemos cambiar para despertar y desbloquear el dispositivo como se describe? ¡Gracias de antemano por su ayuda!