我正在爲計算機科學的最終論文開發一個應用程序,而且我需要收集並記錄加速計數據。我需要購買一整天,因此存在嚴重的電池限制(例如,我無法離開屏幕)。另外,這不是一個針對市場的應用程序,因此如果需要,進行一些嚴重的黑客攻擊,即使是低級的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