2011-03-07 98 views
9

我想在几小时内定期从Android设备的相机拍摄照片,以创建延时视频效果。Android - 如何从困难的睡眠中唤醒手机拍照?

我设置了AlarmManager,AlarmManager.RTC_WAKEUP标志设置为每隔几分钟启动一项服务。

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

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

如果设备处于清醒状态,则所有事情都按预期完美工作。但是,如果设备处于睡眠状态,则Activity的onResume()方法完成后,活动立即暂停。相机的预览表面永远不会完成初始化,也不会拍摄任何照片。

所以我的问题是:

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

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

但是,这并不唤醒手机,如果它是睡着了。

  1. 有什么方法可以在不使用预览表面视图的情况下拍照吗?

  2. 有没有办法拍摄不依赖异步回调的图片?我可以将活动onResume()方法中的所有代码拍摄照片吗?

  3. 是否有任何方法让Activity的onResume()方法运行时间足够长,以便相机的预览有足够的时间来初始化并调用所有侦听器?

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

为了解决这个问题,我试着让所有的Android 1.6兼容,因为那是我唯一可以访问的测试设备。

这是令人沮丧的东西!

+0

任何原因您没有在您的服务中完成所有这些工作? – 2013-11-13 17:01:41

+0

这个问题已经有一段时间了,所以我不是100%确定的。当手机处于沉睡状态时,我认为服务不运行,这就是为什么我必须先使用闹钟管理器唤醒手机。 – 2013-11-13 20:17:22

+0

如果您设法运行该服务(有一种方法) - 是否需要在Activity_中执行所有活动?原因如果不是我认为我得到了答案 – 2013-11-13 20:20:28

回答

8

我终于得到了一个地方。

我一直在使用这两个标志

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。

+0

不要忘记这个permision max 2015-03-09 10:44:32

0

你在你的onResume方法做这样的事情

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

如果是这样,只要方法退出,将激活锁定被释放,该装置可以自由地做任何感觉像做(这很可能会回到睡眠状态) ,您需要将WakeLock存储在某个地方,而不是本地功能。

+0

我使用onResume()方法内的wakelock的类变量: 'PowerManager pm =(PowerManager)getSystemService(Context.POWER_SERVICE); wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK,“ActivityWakeLock”); wl.acquire();' – 2011-03-07 15:39:25

2

您还可以

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

只要你有DISABLE_KEYGUARD权限禁用键盘锁屏。

从API级别1开始可用。

相关问题