Акселерометр Android: SensorManager.DATA_X устарел — что теперь?

Я написал приложение акселерометра (в учебных целях), используя некоторые предложения из StackOverflow. Все работает нормально, но я получаю сообщение «SensorManager.DATA_X устарело» в качестве предупреждения в моем коде:

// setup the textviews for displaying the accelerations
mAccValueViews[SensorManager.DATA_X] = (TextView) findViewById(R.id.accele_x_value);
mAccValueViews[SensorManager.DATA_Y] = (TextView) findViewById(R.id.accele_y_value);
mAccValueViews[SensorManager.DATA_Z] = (TextView) findViewById(R.id.accele_z_value);

Я пытался искать здесь и в других местах, что мне следует делать вместо использования «SensorManager.DATA_X», но я не могу найти никаких инструкций.

В официальном руководстве говорится, что вместо этого следует использовать «сенсор», но я не могу понять, как это сделать!

Если кто-нибудь может предложить новый "официальный" способ сделать это, я был бы очень признателен.

Изменить После повторного прочтения документации (на этот раз правильно!) я заметил, что "SensorManager.DATA_X" просто возвращает целое число, которое является индексом значения X в массиве. возвращается onSensorChanged(int, float[]). Я смог изменить приведенный выше код на этот, который работает отлично и без каких-либо устаревших предупреждений:

// setup the textviews for displaying the accelerations
    mAccValueViews[0] = (TextView) findViewById(R.id.accele_x_value);
    mAccValueViews[1] = (TextView) findViewById(R.id.accele_y_value);
    mAccValueViews[2] = (TextView) findViewById(R.id.accele_z_value);

person BryanJ    schedule 03.12.2012    source источник
comment
Вы читали документацию: developer.android.com/guide/topics/sensors/   -  person Bart Friederichs    schedule 03.12.2012


Ответы (1)


В документации все понятно, создайте свой датчик:

private SensorManager mSensorManager;
private Sensor mSensor;

mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

if (mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null){
    mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}

И вот ваш Sensor, зарегистрируйте прослушиватель, чтобы использовать его:

mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);

Затем вы можете использовать OnSensorChanged для получения значений:

  @Override
  public final void onSensorChanged(SensorEvent event) {
    // Many sensors return 3 values, one for each axis.
    float xaccel = event.values[0];
    // Do something with this sensor value.
  }
person Bart Friederichs    schedule 03.12.2012
comment
Привет, спасибо за ваш ответ. Да, я следовал этой процедуре для моего метода onSensorChanged, однако позже в коде, который я повторно использую, в методе onCreate появляется код, который я разместил выше. Я хотел бы заменить SensorManager.DATA_X некоторой ссылкой для event.values[i], определенных в методе onSensorChanged, но я не могу этого сделать! - person BryanJ; 04.12.2012
comment
Я думаю, вам придется инициализировать их 0 и установить их в первом событии onSensorChanged. Я считаю, что он срабатывает в течение миллисекунд после регистрации слушателя. - person Bart Friederichs; 04.12.2012
comment
Спасибо еще раз. Что ж, ваш первый комментарий о чтении документации был точным. Когда я перечитал документацию должным образом на этот раз, я заметил, что SensorManager.DATA_X возвращает int, который является индексом значения X в массиве, возвращаемом onSensorChanged(int, float[]). Поскольку это только значения индекса, я смог заменить mAccValueViews[SensorManager.DATA_X] на mAccValueViews[0]....и т.д.... - person BryanJ; 04.12.2012