Android – 我怎样才能从困难的睡眠中唤醒手机拍照?

我想要在几小时内定期从Android设备的相机拍摄照片,以创build延时video效果。

我设置了一个AlarmManager.RTC_WAKEUP标志设置为每几分钟启动一个服务的报警pipe理器。

该服务持有一个部分唤醒锁,做一些工作,然后通过启动活动的闹钟pipe理器调用广播接收器。

活动创build(或恢复),打开自己的唤醒锁,并设置相机预览表面。 一旦表面被设置,SurfaceHolder监听器的surfaceChanged()方法被调用,最终拍摄一张照片。

如果设备清醒,一切都如预期的完美。 但是,如果设备处于睡眠状态,一旦Activity的onResume()方法结束,活动立即暂停。 相机的预览表面永远不会完成初始化,也不会拍摄任何照片。

所以我的问题是:

  1. 有没有办法以编程方式唤醒电话? 我甚至尝试使用:

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

但是,如果它睡着了,它不会唤醒电话。

  1. 有没有办法拍照而不使用预览表面视图?

  2. 有没有办法拍摄不依赖于asynchronouscallback的图片? 我可以把所有的活动onResume()方法的代码拍照吗?

  3. 有没有办法让Activity的onResume()方法运行足够长时间,以便相机的预览有足够的时间来初始化和调用所有的监听器?

我正确使用wakelocks,并且我已经在清单文件中正确设置了所有权限。 我的活动不保持足够长的时间,以使asynchronous侦听器正常工作。

而为了解决这个问题,我正在努力保持Android 1.6兼容的一切,因为这是我唯一可以访问的testing设备。

这是令人沮丧的东西!

Solutions Collecting From Web of "Android – 我怎样才能从困难的睡眠中唤醒手机拍照?"

我现在终于到了某个地方。

我必须使用这两个标志创build一个唤醒锁

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

然后,设备醒来,从键盘屏幕开始。

但是我可以通过键盘锁屏拍照的唯一方法就是在活动窗口中使用这些标志:

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

但这只适用于Android 2.0,并不适用于1.6。

您也可以使用禁用键盘锁屏

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

前提是您拥有DISABLE_KEYGUARD权限。

从API级别1开始可用。

你在onResume方法中做了这样的事情吗?

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

如果是这样,只要方法退出,WakeLock就会被释放,设备可以自由地做任何事情(可能会重新进入睡眠状态),您需要将WakeLock存储在某个地方,不作为本地function。