Android-Как я могу разбудить телефон от тяжелого сна, чтобы сделать снимок?

Я хочу периодически делать снимки с камеры Android-устройства в течение нескольких часов,чтобы создать эффект замедленного действия.

Я установил диспетчер будильника с помощью AlarmManager.Флаг RTC_WAKEUP установлен для запуска службы каждые несколько минут.

служба содержит частичный wakelock, выполняет некоторую работу, а затем вызывает широковещательный приемник через Диспетчер сигналов тревоги, который запускает действие.

действие создано (или возобновлено), включает его собственный wakelock и настраивает поверхность предварительного просмотра камеры. После настройки surface вызывается метод surfacechanged() прослушивателя SurfaceHolder, который, наконец, делает снимок.

Если устройство не спит, все работает отлично, как ожидалось. Но если устройство спит, как только метод onResume() действия завершен, действие немедленно приостанавливается. Поверхность предварительного просмотра камеры никогда не завершает инициализацию, и изображение никогда не будет сделано.

Итак, вопросы I есть:

  1. есть ли способ разбудить телефон программно? Я даже пытаюсь использовать:

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

но это не будит телефон, если он спит.

  1. есть ли способ сделать снимок без использования предварительного просмотра поверхности?

  2. есть ли способ сделать снимок, который не зависит от асинхронных обратных вызовов? Могу ли я поместить весь код в действия onResume() способ сделать снимок?

  3. есть ли способ сохранить метод onResume() действия достаточно долго, чтобы предварительный просмотр камеры имел достаточно времени для инициализации и вызова всех слушателей?

Я правильно использую wakelocks, и у меня все разрешения установлены правильно в файле манифеста. Моя активность не бодрствует достаточно долго, чтобы асинхронные слушатели правильно работали.

и усугубить проблему, Я пытаюсь сохранить совместимость с Android 1.6, потому что это единственное тестовое устройство, к которому у меня есть доступ.

это расстраивает вещи!

3 ответов


Я наконец-то получил где-то сейчас.

Я должен создать wakelock, используя эти два флага

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();

затем устройство просыпается и запускается на экране keyguard.

но единственный способ пройти мимо экрана keyguard и сделать снимок-использовать эти флаги в окне активности:

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

но это доступно только с Android 2.0 и не работает в 1.6.


вы также можете отключить экран Keyguard с помощью

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

при условии, что у вас есть разрешение DISABLE_KEYGUARD.

это доступно с уровня API 1.


вы делаете что-то подобное в своем методе onResume

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

Если это так, как только метод выходит, WakeLock освобождается, и устройство свободно делать все, что ему нравится делать ( что, вероятно, вернется в сон ) и Вам нужно будет хранить WakeLock в классе где-то, а не как локальную функцию.