加速度計の更新頻度を 1hz まで遅くすることは可能ですか?
nexus 7 タブでこれを試してみました: sensorDelay_Normal を 1.000.000 に変更しましたが、何も変わりませんでした。ありがとう!
コードは次のとおりです。
mAccelerometer.registerListener(listener,mAccelerometer.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.1000000);
加速度計の更新頻度を 1hz まで遅くすることは可能ですか?
nexus 7 タブでこれを試してみました: sensorDelay_Normal を 1.000.000 に変更しましたが、何も変わりませんでした。ありがとう!
コードは次のとおりです。
mAccelerometer.registerListener(listener,mAccelerometer.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.1000000);
これは私が1Hzの加速を得る方法です:
static int ACCE_FILTER_DATA_MIN_TIME = 1000; // 1000ms
long lastSaved = System.currentTimeMillis();
@Override
public void onSensorChanged(SensorEvent event) {
if ((System.currentTimeMillis() - lastSaved) > ACCE_FILTER_DATA_MIN_TIME) {
lastSaved = System.currentTimeMillis();
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
}
}
毎秒 1 つを除いて、いつでも測定値を無視できます。それとも、バッテリーを節約したいですか?
センサー速度の値のカスタム値はうまく機能しません。
クラスを調べると、すべての .registerListener() メソッドに「getDelay」関数があることがわかります。
public boolean registerListener(SensorEventListener listener, Sensor sensor, int rateUs,
int maxBatchReportLatencyUs) {
int delay = getDelay(rateUs);
return registerListenerImpl(listener, sensor, delay, null,maxBatchReportLatencyUs, 0);
}
これも同じクラスで定義されています。
private static int getDelay(int rate) {
int delay = -1;
switch (rate) {
case SENSOR_DELAY_FASTEST:
delay = 0;
break;
case SENSOR_DELAY_GAME:
delay = 20000;
break;
case SENSOR_DELAY_UI:
delay = 66667;
break;
case SENSOR_DELAY_NORMAL:
delay = 200000;
break;
default:
delay = rate;
break;
}
return delay;
}
したがって、通常はカスタム値を設定することができます。ただし、約 100 ミリ秒 (100000マイクロ秒)を超えるカスタム値を使用しようとすると、イベント間の測定時間が 1000 ミリ秒まで跳ね上がり、そこにとどまる可能性があります。1000 ミリ秒、2000 ミリ秒、またはそれ以上のミリ秒を設定しても、イベント間の時間は依然として約 1000 ミリ秒です。
SENSOR_DELAY_NORMAL (= 200 ミリ秒) を使用して、毎回チェックすることで十分な時間が経過した場合にイベントをキャッチすることができます (David のように) より高い場合は、このエナリドレインアプローチを使用しないでください - 代わりに、sensorListener を登録して値をキャッチし、それを登録解除します毎回。
現在のアプローチでは、アプリケーションはまだ 60 ミリ秒ごとにイベントを取得しています。15 個のイベントのうち 14 個を破棄したからといって、センサー ハードウェアが 60 ミリ秒ごとに 1 回データを処理する必要があり、システムがデータを受信してアプリケーションに送信するため、バッテリーの消費は減りません。つまり、バッテリーの節約はあまりありません。
上記の方法を正確に行うには、各イベントが平均で約 60 ミリ秒で発生するため、16 または 17 のイベントからサンプルを選択する必要があります。
複数の sensorEventListeners を登録するとデバイスがフリーズすることSENSOR_DELAY_NORMALは、Android フレームワークの問題ではありません (シナリオを簡単に処理できます)。これは、アプリケーションの作成方法に問題があることを示しています。最初に探すべきことは、メイン UI スレッド内の CPU を集中的に使用するコードです。開発者のガイドラインに従って、複数の sensorEventListeners() が登録されSENSOR_DELAY_NORMAL、CPU を集中的に使用する計算を実行する複数のワーカー スレッドでアプリケーションが応答するようにします。