Как следует вызывать sensorManager.registerListener() в onResume()?

Я тестирую приложение, которое отбирает данные акселерометра и обрабатывает их.

При первой установке приложения onSensorChanged() вызывается со скоростью 1/2 скорости, указанной в samplePeriodUs.

Я попытался отменить регистрацию и зарегистрировать прослушиватель SensorManager в onPause(). Один хак, который, кажется, работает, заключается в том, чтобы ввести 1/2 частоты дискретизации в onResume(). Это не может быть правильным способом ведения дел?

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    sensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE);
    accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    sensorManager.registerListener(this, accelerometer, 20000); }

 public void onResume() {
    super.onResume();
    sensorManager.unregisterListener(this);
    sensorManager.registerListener(this, accelerometer, 10000);
}

public void onPause() {
    super.onPause();
    sensorManager.unregisterListener(this); }

Я ожидаю, что sensorManager.registerListener (это, акселерометр, 20000); для использования в onResume() и в onCreate()


person dme881    schedule 06.02.2019    source источник
comment
Если я удалю sensorManager.registerListener (это, акселерометр, 20000); из onCreate() и поместите 20000 в registerListener в onResume(), это работает. Но действительно ли это правильно?   -  person dme881    schedule 07.02.2019


Ответы (1)


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

private SensorManager mSensorManager;
private Sensor mAccelerometer, mGyroscope, mMagnetometer;

@Override
protected void onResume() {
    super.onResume();
    mSensorManager.registerListener(mSensorEventListener, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
    mSensorManager.registerListener(mSensorEventListener, mGyroscope, SensorManager.SENSOR_DELAY_NORMAL);
    mSensorManager.registerListener(mSensorEventListener, mMagnetometer, SensorManager.SENSOR_DELAY_NORMAL);
}

@Override
protected void onPause() {
    super.onPause();
    mSensorManager.unregisterListener(mSensorEventListener);
}

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

    mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
    mGyroscope = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
    mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

    mSensorManager.registerListener(mSensorEventListener, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);

}

/**
* Listener that handles sensor events
*/
private final SensorEventListener mSensorEventListener = new SensorEventListener() {
    @Override
    public void onSensorChanged(SensorEvent event) {
        //if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
        if (event.sensor.getType() == Sensor.TYPE_LINEAR_ACCELERATION) {
            // Do work
        } else if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
            // Do work
        } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
            // Do work
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {
    }
}; 

Полный исходный код проекта можно найти по адресу https://github.com/Wickapps/Activity-Tracker

person Mark JW    schedule 06.02.2019