Сенсоры — это встроенные в Android измерительные приборы, которые определяют движение, расположение в пространстве, параметры окружающей среды. Приложение может получать данные этих сенсоров.

Работа с сенсорами ведется через SensorManager:

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

Работа со всеми сенсорами на устройстве осуществляется единообразно. Есть три возможности выбрать нужный сенсор из всего множества сенсоров на устройстве:

  1. Получить дефолтный сенсор заданного типа:
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

Список типов сенсоров можно найти в документации.

  1. Получить список сенсоров заданного типа:
sensorList = sensorManager.getSensorList(Sensor.TYPE_GRAVITY);

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

  1. Получить список всех сенсоров на устройстве:
sensorList = sensorManager.getSensorList(Sensor.TYPE_ALL);

Объект Sensor, возвращаемый SensorManager, предоставляет различную информацию о сенсоре, например:

Обратите внимание, что у объекта Sensor нет уникального ID, так как обычно идентифицировать этот объект в списке подобных нет необходимости. Поэтому в приложении я передаю во вторую Activity порядковый номер в списке всех найденных сенсоров.

Чтобы получать обновления данных сенсора, необходимо зарегистрировать получателя:

@Override
protected void onResume() {
    
    sensorManager.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_UI);
}

Не забываем отменить регистрацию при исчезновении необходимости:

@Override
protected void onPause() {
    
    sensorManager.unregisterListener(listener);
}

При регистрации необходимо указать сенсор, данные которого нам нужны, и константу, определяющую, как часто операционная система будет передавать получателю новые данные:

  • SENSOR_DELAY_NORMAL — достаточная для простых применений частота, примерно 5 обновлений в секунду
  • SENSOR_DELAY_UI — для показа в интерфейсе, около 16 обновлений в секунду
  • SENSOR_DELAY_GAME — для игр, около 50 обновлений в секунду
  • SENSOR_DELAY_FASTEST — с предельно возможной частотой

Обратите внимание, что константа в третьем параметре — это ID соответствующей частоты обновлений, а не сама частота и не задержка.

Получателю могут прийти точность сенсора (int) и измеренные данные (SensorEventListener). Сами значения приходят в виде массива float. Размер и содержимое массива зависят от типа сенсора, подробности нужно уточнять в документации.

В рамках демонстрации я их вывожу на экран:

@Override
public void onSensorChanged(SensorEvent event) {
    StringBuilder sb = new StringBuilder();
    for (float value : event.values) {
        sb.append(value).append("\n");
    }
 
    valuesView.setText(sb.toString());
}
 
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
    accuracyView.setText("" + accuracy);
}

Ссылки