我正在为我的计算机科学毕业论文开发一个应用程序,我需要收集和记录加速度计数据。我需要整整一整天才购买它,所以电池电量受到严重限制(例如,我无法打开屏幕)。而且,这不是面向市场的应用程序,因此,如果需要的话,进行一些严重的黑客入侵甚至是低级C / C ++编码也是可以接受的。
众所周知,在许多设备上,当屏幕关闭时,加速度计事件的侦听器会停止生成事件(有关此问题的一些链接:http : //code.google.com/p/android/issues/detail? id = 3708,加速度计当屏幕在Droid / Nexus One上关闭时,即使有WakeLock,也停止提供样品。我已经彻底搜索了一些替代方法,其中一些方法不适用于我的设备(LG P990,ROM)。
所以发生了什么事情:当您在服务中注册android加速度传感器的事件监听器时,它工作正常,直到屏幕关闭。我已经尝试在IntentService上的服务上注册eventListener,试图获取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及更高版本是否仍然存在该问题?
[更新]
不幸的是,这似乎是某些手机的错误。我的答案中有更多细节。