我正在为计算机科学的最终论文开发一个应用程序,而且我需要收集并记录加速计数据。我需要购买一整天,因此存在严重的电池限制(例如,我无法离开屏幕)。另外,这不是一个针对市场的应用程序,因此如果需要,进行一些严重的黑客攻击,即使是低级的C/C++编码也是可以接受的。当屏幕关闭时Android加速度计不工作
众所周知,在许多设备上,加速计事件监听器在屏幕熄灭时停止生成事件(有关此问题的一些链接:http://code.google.com/p/android/issues/detail?id=3708,Accelerometer stops delivering samples when the screen is off on Droid/Nexus One even with a WakeLock)。我彻底搜索了一些替代品,其中一些替代品包括不适用于我的设备(LG P990,库存ROM)的解决方法。
因此会发生什么: 当您在服务中为android加速度计传感器注册事件侦听器时,它会正常工作,直到屏幕关闭。我已经尝试在IntentService上的服务上注册eventListener,试图获取WakeLocks。关于wakelocks,我可以验证服务仍在运行看LOGcat输出,但似乎加速度计进入睡眠模式。一个在某些环节提出的解决方法是注销并重新注册事件监听器定期使用IntentService的线程想在这个代码片段波纹管
synchronized private static PowerManager.WakeLock getLock(Context context) {
if (lockStatic==null) {
PowerManager mgr=(PowerManager)context.getSystemService(Context.POWER_SERVICE);
lockStatic = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,NAME);
lockStatic.setReferenceCounted(true);
}
return(lockStatic);
}
@Override
protected void onHandleIntent(Intent intent) {
sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);
sensorManager.unregisterListener(this);
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
synchronized (this) {
boolean run = true;
while (run){
try {
wait(1000);
getLock(AccelerometerService.this).acquire();
sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);
sensorManager.unregisterListener(this);
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
Log.d("Accelerometer service", "tick!");
} catch (Exception e) {
run = false;
Log.d("Accelerometer service", "interrupted; cause: " + e.getMessage());
}
}
}
}
@Override
public void onSensorChanged(SensorEvent event) {
Log.d("accelerometer event received", "xyz: "+ event.values[0] + "," + event.values[1] + "," + event.values[2]);
}
这的确使得onSensorChange叫我们每次取消注册/注册侦听器。问题是收到的事件总是包含相同的值,无论我摇晃设备。
所以,基本上我的问题是:(多多包涵,我即将结束:P)
是有可能有低级别的访问(C/C++的方法)来加速计硬件,而不注册到事件监听器?
有没有其他的解决方法或破解?
任何人都可以使用更新的手机进行测试,如果问题仍然存在于固件3.0或更高版本中?
[更新]
不幸的是,这似乎是与一些手机的bug。更多细节在我的答案中。
嗨。我刚刚用我的HTC Sensation(ICS)测试了这个问题。加速度计和磁场传感器都在屏幕关闭的情况下保持报告值。另外,您是否检查了评论[46](http://code.google.com/p/android/issues/detail?id=3708)中描述的解决方法? – Renard 2012-04-02 20:10:07
谢谢你的反馈Renard。 关于评论46,我也试过了,它和运行定期取消注册/注册事件监听器的线程几乎是一样的。但是对于我的设备,每次关闭显示器时我只能获得加速度计的固定值.. 也感谢您在ICS上进行测试...它很高兴知道它适用于它应该,可悲的是没有ICS的LG P990了呢=/ – martin 2012-04-03 01:47:50
可能会有用尝试解决问题从另一方 - 获取屏幕锁定,但同时将屏幕亮度降至零以节省电池电量?当然,使用电源按钮关闭屏幕时不起作用,但在这种情况下,您可以尝试唤醒设备以防止屏幕锁定。 – 2012-04-25 20:21:33