本文介紹了安卓加速度計(jì)每次返回相同的值的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
我正在嘗試記錄加速度計(jì)的每秒4個(gè)采樣值。因此,我每250毫秒重復(fù)一次我的邏輯(我也嘗試了每秒4個(gè)采樣)。
每次我的方法結(jié)束時(shí),我注銷傳感器并在我的方法開(kāi)始時(shí)重新注冊(cè)(當(dāng)我沒(méi)有注銷傳感器時(shí),我的邏輯在onSensorChanged中不起作用,并且它持續(xù)記錄所有數(shù)據(jù))。
通過(guò)這種方法(每秒或每四分之一秒注冊(cè)和注銷傳感器),我能夠管理加速度計(jì)的采樣率,但每次都返回相同的值。
這是我的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
}
如果需要任何其他信息,請(qǐng)通知我。
推薦答案
不要每次都取消注冊(cè)和注冊(cè)監(jiān)聽(tīng)器。嘗試在onCreate或onStart方法中注冊(cè)偵聽(tīng)器,并在onFinish上注銷偵聽(tīng)器。
我非常確定您的錯(cuò)誤來(lái)自于這樣一個(gè)事實(shí),即每次檢測(cè)到變化時(shí),您似乎都會(huì)”重置”您的加速度計(jì)。
換句話說(shuō),刪除您的呼叫
sensorManager.registerListener(JumpingBall.this, accelerometer, sensorManager.SENSOR_DELAY_NORMAL);
和
sensorManager.unregisterListener(JumpingBall.this);
當(dāng)您開(kāi)始上下文時(shí),將onSensorChanged
方法中的sensorManager.registerListener
放入Main/中,并在完成上下文后將sensorManager.unregisterListener
放入onFinded/中。
https://developer.android.com/guide/topics/sensors/sensors_motion.html
這里還提供了一些如何設(shè)置某些傳感器(包括加速計(jì))的示例的鏈接。您可以在頂部看到它們?nèi)绾纬跏蓟瘋鞲衅?,然后使?code>onSensorChanged記錄數(shù)據(jù)。
編輯:
以下是我會(huì)做的事情。使您的onSensorChanged
仍然在每次加速度計(jì)檢測(cè)到什么東西時(shí)記錄事件,這就是您想要做的。確保在您的onCreate.
中注冊(cè)監(jiān)聽(tīng)程序這非常重要。然后,當(dāng)你的計(jì)時(shí)器滴答作響時(shí),確保你記錄了這些值。通過(guò)將onSensorChanged
和timer.scheduleAtFixedRate
方法設(shè)置為包私有(即確保在類的頂部對(duì)其進(jìn)行初始化),確保變量可用于onSensorChanged
和timer.scheduleAtFixedRate
方法。您也不需要只運(yùn)行一次的for循環(huán),那么它就不是一個(gè)循環(huán)。
因此,我們的想法是始終讀取值,但僅每隔250ms記錄它們一次。正如另一位用戶所指出的,每次發(fā)生新事件時(shí),您都會(huì)創(chuàng)建一個(gè)新的計(jì)時(shí)器,這不是您想要做的。嘗試實(shí)現(xiàn)以下代碼:
//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
}
您可能必須將計(jì)時(shí)器代碼添加到onCreate
或onStart
方法中,我不確定您的項(xiàng)目是什么樣子,但在合適的地方實(shí)現(xiàn)它。
這篇關(guān)于安卓加速度計(jì)每次返回相同的值的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,