Сенсоры
Сенсоры — это встроенные в Android измерительные приборы, которые определяют движение, расположение в пространстве, параметры окружающей среды. Приложение может получать данные этих сенсоров.
Работа с сенсорами ведется через SensorManager
:
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Работа со всеми сенсорами на устройстве осуществляется единообразно. Есть три возможности выбрать нужный сенсор из всего множества сенсоров на устройстве:
- Получить дефолтный сенсор заданного типа:
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
Список типов сенсоров можно найти в документации.
- Получить список сенсоров заданного типа:
sensorList = sensorManager.getSensorList(Sensor.TYPE_GRAVITY);
По каким критериям выбирать сенсор из полученного списка, решать вам. Возможно, это нужно делать по названию сенсора или имени разработчика сенсора (оно может не совпадать с разработчиком телефона). Настоящих историй, когда приходилось выбирать сенсор по производителю, я пока не встречал. Если увидите — поделитесь ссылкой.
- Получить список всех сенсоров на устройстве:
sensorList = sensorManager.getSensorList(Sensor.TYPE_ALL);
Объект Sensor
, возвращаемый SensorManager
, предоставляет различную информацию о
сенсоре, например:
- название getName()
- производитель getVendor()
- тип сенсора getType()
- максимальное значение getMaximumRange()
Обратите внимание, что у объекта 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);
}