屏幕关闭时是否可以检测到运动?

8
我的应用程序只需要在屏幕关闭时检测设备的任何动作。
我知道加速度计用于此任务,但在所有设备上屏幕关闭时都无法正常工作。这是一份设备列表 http://www.saltwebsites.com/2012/android-accelerometers-screen-off
那么有没有一种方法可以在所有设备上在屏幕关闭时获取加速度传感器数据?
或者是否有其他传感器可以检测运动?
4个回答

7

只需使用Partial Wake Lock,就可以在屏幕关闭时访问加速度计读数。

您可以像这样使用它:

private PowerManager.WakeLock mWakeLock;

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
mWakeLock.acquire();

完成后,只需释放锁定:

mWakeLock.release();

如果您在Service中获取加速度计数据,您可以在onCreate()中简单地获取锁定并在onDestroy()中释放。

不,它也应该在Activity中工作。你怎么知道它没有工作?如果你确定你已经做对了一切,也许是机器特定问题,就像Gunaseelan指出的那样。 - alex
我正在三星Galaxy Note II上进行测试。在这里看看 https://dev59.com/-2kw5IYBdhLWcg3wUI1W 答案中解释了为什么我提出了这个问题 :) - Ahmed Hegazy
我不知道哪些设备存在错误,但它在我的三星Galaxy SII上运行良好。所以我想它对你也应该可以工作...请务必仔细检查你的代码。 - alex
@7agooz,你需要将acquire()放在onResume()onStart()中,并将release()放在onPause()onStop()中。你搞反了。 - alex
@7agooz 好的,我现在猜测是应用程序的主UI线程在锁定手机后被休眠了。如果是这种情况,那么Service就是你最后的选择。试一试吧,在UI线程中进行这种计算不是一个好主意。 - alex
@alex,我的GTN7100也有同样的问题...但在其他设备上运行良好。 - Sharanabasu Angadi

4
是的,你可以在后台或屏幕关闭时使用加速度计,但你需要持有一个 WakeLock 以防止设备睡眠。[链接] 如果你需要检测设备是否静止或重新开始移动,你可能会对 Google 服务中的识别用户当前活动感兴趣。

WaveLock无法工作。"识别用户当前活动"是依赖于互联网连接还是传感器技术? - Ahmed Hegazy
它不应该需要互联网连接,但我不能百分之百确定。然而,设备上需要安装Google Play服务。 - Plato

2

经过快速研究,我发现大多数安卓设备在屏幕关闭时不会发送加速度计事件。要了解更多关于此错误的信息,请查看这里。还有这里


所以没有变通方法,也没有其他办法在屏幕关闭时检测运动吗? - Ahmed Hegazy
我想是的,但我不确定兄弟 @7agooz。 - Gunaseelan

1

当屏幕关闭时,CPU会进入睡眠状态,您不能在不获取部分唤醒锁的情况下捕获事件。建议您在调用onPause时获取部分唤醒锁,并在onResume释放它。请注意唤醒锁会导致手机耗电量巨大,您应该小心管理。

附注:您必须在onPause方法中获取唤醒锁,因为如果尝试在其他地方调用它,则可能无法获得锁,因为CPU可能已经关闭。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接