我正在为我的计算机科学毕业论文开发一个应用程序,我需要收集和记录加速度计数据。我需要一整天的时间来使用它,所以有严重的电池限制(例如,我不能让屏幕一直开着)。此外,这不是一个针对市场的应用程序,所以做一些严重的黑客行为是可以接受的,即使是低级的 C/C + + 编码,如果需要的话。
众所周知,在许多设备上,当屏幕关闭时,加速计事件的监听器停止生成事件(关于这个问题的一些链接: http://code.google.com/p/android/issues/detail?id=3708,当 Droid/Nexus One 上的屏幕关闭时,加速度计就会停止传送样品,即使它带有 WakeLock)。我已经彻底搜索了一些替代方案,其中一些包括工作区,不适合我的设备(LG P990,股票 ROM)。
事情是这样的: 当您为服务中的 android 加速计传感器注册一个事件侦听器时,它工作得很好,直到屏幕关闭。我已经尝试在服务上注册事件监听器,在意图服务上尝试获取 WakeLocks。关于 wakelocks,我可以验证服务是否仍在运行,观察 LOGcat 的输出,但似乎加速计进入了睡眠模式。一些链接中提供的变通方法之一是使用 InentService 的线程定期取消注册并重新注册事件侦听器,如下面的代码片段所示
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及以上版本的固件中仍然存在,是否有人可以使用更新的手机进行测试?
[更新]
不幸的是,这似乎是一些手机的错误。更多细节在我的回答。