本文介紹了安卓加速度計每次返回相同的值的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我正在嘗試記錄加速度計的每秒4個采樣值。因此,我每250毫秒重復一次我的邏輯(我也嘗試了每秒4個采樣)。
每次我的方法結束時,我注銷傳感器并在我的方法開始時重新注冊(當我沒有注銷傳感器時,我的邏輯在onSensorChanged中不起作用,并且它持續記錄所有數據)。
通過這種方法(每秒或每四分之一秒注冊和注銷傳感器),我能夠管理加速度計的采樣率,但每次都返回相同的值。
這是我的onSensorChanged
方法。
@Override
public void onSensorChanged(final SensorEvent event) {
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
sensorManager.registerListener(JumpingBall.this, accelerometer, sensorManager.SENSOR_DELAY_NORMAL);
float deltaX1 = (float) ((event.values[0])/9.81);
float deltaY1 = (float) ((event.values[1])/9.81);
float deltaZ1 = (float) ((event.values[2])/9.81);
int i=0;
for (i=0;i<1;i++) {
listx.add(String.valueOf(deltaX1));
listy.add(String.valueOf(deltaY1));
listz.add(String.valueOf(deltaZ1));
}
sensorManager.unregisterListener(JumpingBall.this);
}
}, 0, 250);//put here time 1000 milliseconds=1 second
}
如果需要任何其他信息,請通知我。
推薦答案
不要每次都取消注冊和注冊監聽器。嘗試在onCreate或onStart方法中注冊偵聽器,并在onFinish上注銷偵聽器。
我非常確定您的錯誤來自于這樣一個事實,即每次檢測到變化時,您似乎都會”重置”您的加速度計。
換句話說,刪除您的呼叫
sensorManager.registerListener(JumpingBall.this, accelerometer, sensorManager.SENSOR_DELAY_NORMAL);
和
sensorManager.unregisterListener(JumpingBall.this);
當您開始上下文時,將onSensorChanged
方法中的sensorManager.registerListener
放入Main/中,并在完成上下文后將sensorManager.unregisterListener
放入onFinded/中。
https://developer.android.com/guide/topics/sensors/sensors_motion.html
這里還提供了一些如何設置某些傳感器(包括加速計)的示例的鏈接。您可以在頂部看到它們如何初始化傳感器,然后使用onSensorChanged
記錄數據。
編輯:
以下是我會做的事情。使您的onSensorChanged
仍然在每次加速度計檢測到什么東西時記錄事件,這就是您想要做的。確保在您的onCreate.
中注冊監聽程序這非常重要。然后,當你的計時器滴答作響時,確保你記錄了這些值。通過將onSensorChanged
和timer.scheduleAtFixedRate
方法設置為包私有(即確保在類的頂部對其進行初始化),確保變量可用于onSensorChanged
和timer.scheduleAtFixedRate
方法。您也不需要只運行一次的for循環,那么它就不是一個循環。
因此,我們的想法是始終讀取值,但僅每隔250ms記錄它們一次。正如另一位用戶所指出的,每次發生新事件時,您都會創建一個新的計時器,這不是您想要做的。嘗試實現以下代碼:
//Initialize these up top
private float deltaX1 = 0;
private float deltaY1 = 0;
private float deltaZ1 = 0;
@Override
public void onSensorChanged(final SensorEvent event) {
deltaX1 = (float) ((event.values[0])/9.81);
deltaY1 = (float) ((event.values[1])/9.81);
deltaZ1 = (float) ((event.values[2])/9.81);
}
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
listx.add(String.valueOf(deltaX1));
listy.add(String.valueOf(deltaY1));
listz.add(String.valueOf(deltaZ1));
}, 0, 250);//put here time 1000 milliseconds=1 second
}
您可能必須將計時器代碼添加到onCreate
或onStart
方法中,我不確定您的項目是什么樣子,但在合適的地方實現它。
這篇關于安卓加速度計每次返回相同的值的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,