2011-03-07 12 views
9

Quiero tomar fotos de la cámara del dispositivo Android periódicamente en cuestión de horas, para crear un efecto de video de lapso de tiempo.Android - ¿Cómo puedo despertar el teléfono de un sueño difícil para tomar una foto?

Configuré un Alarm Manager con un indicador AlarmManager.RTC_WAKEUP configurado para iniciar un servicio cada pocos minutos.

El servicio tiene un wakelock parcial, hace algo de trabajo, y luego llama a un receptor de difusión a través del Administrador de alarmas que inicia una actividad.

La actividad se crea (o se reanuda), activa su propio wakelock y configura la superficie de vista previa de la cámara. Una vez que la superficie está configurada, se llama al método surfaceChanged() del oyente SurfaceHolder, que finalmente toma una imagen.

Si el dispositivo está en funcionamiento, todo funciona perfectamente como se esperaba. Pero si el dispositivo está dormido, una vez que el método Activity onResume() finalice, la Actividad se pausará instantáneamente. La superficie de vista previa de la cámara nunca termina de inicializarse y no se tomará ninguna fotografía.

Así que las preguntas que tengo son:

  1. ¿Hay alguna manera de activar el teléfono mediante programación? aunque lo intento usando:

    PowerManager powerManager = 
          (PowerManager)this.getSystemService(Context.POWER_SERVICE); 
    powerManager.userActivity(SystemClock.currentThreadTimeMillis(),false); 
    

Pero eso no levanto el teléfono si está dormido.

  1. ¿Hay alguna manera de tomar una fotografía sin usar una vista previa de la superficie?

  2. ¿Hay alguna manera de tomar una fotografía que no dependa de devoluciones de llamada asincrónicas? ¿Puedo poner todo el código en el método Activities onResume() para tomar una foto?

  3. ¿Hay alguna forma de mantener el método Activity onResume() funcionando lo suficiente para que la vista previa de la cámara tenga tiempo suficiente para inicializar y llamar a todos los oyentes?

estoy usando los wakelocks correctamente, y tengo todos los permisos está configurado correctamente en el archivo de manifiesto. Mi actividad no se mantiene despierta el tiempo suficiente para que los oyentes asincrónicos funcionen correctamente.

Y para complicar el problema, intento mantener todo Android 1.6 compatible, porque es el único dispositivo de prueba al que tengo acceso.

¡Esto es algo frustrante!

+0

¿Alguna razón por la que no está haciendo todo esto en su servicio? –

+0

Ha pasado un tiempo desde esta pregunta, así que no estoy 100% seguro. No creo que los servicios se ejecuten cuando el teléfono está en un sueño difícil, por lo que tuve que usar el Administrador de alarmas para activar primero el teléfono. –

+0

Si logras ejecutar el servicio (hay una forma) - ¿es necesario hacer todo lo que haces en la Actividad _en la Actividad_? Porque si no, creo que recibí la respuesta –

Respuesta

8

Finalmente he llegado a algún lado.

tengo que crear un wakelock el uso de estas dos banderas

PowerManager.SCREEN_BRIGHT_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP 

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP, "bbbb"); 
wl.acquire(); 

A continuación, el dispositivo se activa y comienza en la pantalla de bloqueo de teclas.

Pero la única manera de que pueda pasar de la pantalla de bloqueo de teclas y tomar una fotografía es el uso de estos indicadores en la ventana de la Actividad:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN 
    | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 

Pero esto sólo está disponible con Android 2.0, y no funciona en 1.6.

+0

no olvide este permiso max

0

Qué haces algo como esto en su método de onResume

.... onResume() { 
    .... 
    WakeLock myWakeLock = .....; 
    ... 
} 

Si es así, tan pronto como las salidas método, el WakeLock se libera, y el dispositivo es libre de hacer lo que tiene ganas de hacer (que es probable que vuelva a dormirse) y tendrá que almacenar WakeLock en la clase en alguna parte, no como una función local.

+0

Estoy usando una variable de clase para el wakelock dentro del método onResume(): 'PowerManager pm = (PowerManager) getSystemService (Context.POWER_SERVICE); wl = pm.newWakeLock (PowerManager.FULL_WAKE_LOCK, "ActivityWakeLock"); wl.acquire(); ' –

2

También puede desactivar la pantalla de bloqueo del teclado con

KeyguardManager km = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); 
km.newKeyguardLock(TAG).disableKeyguard(); 

siempre que tenga el permiso DISABLE_KEYGUARD.

Eso está disponible desde API Nivel 1.

Cuestiones relacionadas