Android - 如何从困难的睡眠中唤醒手机拍照?

我想在几个小时内定期从Android设备的相机拍照,以创建一个时间流逝的视频效果。 我设置了一个Alarm Manager,其AlarmManager.RTC_WAKEUP标志设置为每隔几分钟启动一次服务。 该服务包含部分唤醒锁,有些工作,然后通过启动活动的警报管理器调用广播接收器。 活动被创建(或恢复),打开它自己的唤醒锁,并设置相机预览表面。设置表面后,将调用SurfaceHolder侦听器的surfaceChanged()方法,最终拍摄照片。 如果设备处于唤醒状态,一切都会按预期完美运行。但是如果设备处于睡眠状态,一旦Activity的onResume()方法完成,Activity就会立即暂停。相机的预览表面永远不会完成初始化,也不会拍摄任何照片。 所以我的问题是: 有没有办法以编程方式唤醒手机?我甚至尝试使用:
PowerManager powerManager =
            (PowerManager)this.getSystemService(Context.POWER_SERVICE);
powerManager.userActivity(SystemClock.currentThreadTimeMillis(),false);
但是,如果手机处于睡眠状态,则不会唤醒手机。 有没有办法在不使用预览表面视图的情况下拍照? 有没有办法拍摄不依赖异步回调的图片?我可以将所有代码放在Activities onResume()方法中来拍照吗? 有没有办法让Activity的onResume()方法运行得足够长,以便摄像头的预览有足够的时间来初始化并调用所有的监听器? 我正确使用了唤醒锁,并且我在清单文件中正确设置了所有权限。我的活动没有保持足够长的时间以使异步侦听器正常工作。 为了解决这个问题,我试图让所有Android 1.6兼容,因为这是我唯一可以访问的测试设备。 这是令人沮丧的事情!     
已邀请:
我现在终于到了某个地方。 我必须使用这两个标志创建一个唤醒锁
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存储在某个类的类中,而不是本地函数。     

要回复问题请先登录注册