Как получить значения x, y, z от датчика акселерометра Android на регулярной частоте, например, за 20 мс, 40 мс или 60 мс - PullRequest
2 голосов
/ 09 августа 2011

Я работаю над проектом Android и встретил ситуацию ниже:

  1. Теперь нам нужно значение акселерометра на регулярной частоте, например, 20 мс, 40 мс или 60 мс

  2. Сейчас мы SENSOR_DELAY_GAME, но мы обнаружили, что разные устройства имеют разные интервалы для этого параметра.Например, G2 использует 40 мс, G7 использует 60 мс, а Nexus S использует 20 мс.

  3. Я пытался установить таймер или использовал thread.sleep, но из-за проблемы GC в Java, они не могут позволить системе получать значение на регулярной частоте.

Это очень раздражает, и если кто-либо имеет какую-либо идею сказать, есть ли внутри Android SDK подходящий методпозвольте мне получить значения акселерометра на регулярной частоте, это будет очень полезно!

Большое спасибо!

Ответы [ 3 ]

0 голосов
/ 22 ноября 2011

Я создал код, который позволяет вам получить точную частоту на любом устройстве.

Вы можете скачать здесь проекта и получить некоторые объяснения.

В коде вы можете попробовать разные тарифы. Например, нормальный режим на моем Galaxy S2 - 5 Гц.

0 голосов
/ 27 августа 2015

Используйте registerListener, установив период выборки, как показано ниже:

boolean registerListener (SensorEventListener listener, Sensor sensor, int samplingPeriodUs)

Источник

Предостережение : Аргумент samplingPeriodUs является лишь подсказкой для системы. Проверьте это перед использованием.

0 голосов
/ 16 августа 2011

Я сделал это, просто отбрасывая значения, которые раньше, чем я хочу. Не идеально с точки зрения расхода батареи, так как мне нужно, чтобы датчики питали меня чаще, чем мне нужно, но, по крайней мере, тогда я могу контролировать, что они поступают через регулярные промежутки времени.

Что-то вроде:

static final int ACCEL_SENSOR_DELAY = 100;  // the number of milisecs to wait before accepting another reading from accelerometer sensor
long lastAccelSensorChange = 0; // the last time an accelerometer reading was processed
@Override
public void onSensorChanged(SensorEvent sensorEvent) {


    if (sensorEvent.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)  return;

    long now = System.currentTimeMillis();
    if (now-ACCEL_SENSOR_DELAY > lastAccelSensorChange) {
        lastAccelSensorChange = now;
        mCompassValues = event.values.clone();
        //... do your stuff
    }
...