Андрей Смирнов
Время чтения: ~14 мин.
Просмотров: 1

Сенсорные датчики в Android: какие они бывают и как с ними работать

Современный смартфон уже сложно назвать просто компьютером, ведь он умеет гораздо больше своего стационарного предка: и температуру может измерить, и высоту над уровнем моря подсказать, и влажность воздуха определить, а если вдруг забудешь свою ориентацию в пространстве или силу тяжести потеряешь — все исправит. А помогают ему в этом, как ты уже, наверное, догадался, датчики aka сенсоры. Сегодня мы познакомимся с ними поближе, а заодно и проверим, действительно ли мы находимся на Земле. 😉

Датчики всякие нужны!

Для работы с аппаратными датчиками, доступными в устройствах под управлением Android, применяется класс SensorManager, ссылку на который можно получить с помощью стандартного метода getSystemService:

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

Чтобы начать работать с датчиком, нужно определить его тип. Удобнее всего это сделать с помощью класса Sensor, так как в нем уже определены все типы сенсоров в виде констант. Рассмотрим их подробнее:

  • Sensor.TYPE_ACCELEROMETER — трехосевой акселерометр, возвращающий ускорение по трем осям (в метрах в секунду в квадрате). Связанная система координат представлена на рис. 1.
  • Sensor.TYPE_LIGHT — датчик освещенности, возвращающий значение в люксах, обычно используется для динамического изменения яркости экрана. Также для удобства степень освещенности можно получить в виде характеристик — «темно», «облачно», «солнечно» (к этому мы еще вернемся).
  • Sensor.TYPE_AMBIENT_TEMPERATURE — термометр, возвращает температуру окружающей среды в градусах Цельсия.
  • Sensor.TYPE_PROXIMITY — датчик приближенности, который сигнализирует о расстоянии между устройством и пользователем (в сантиметрах). Когда в момент разговора гаснет экран — срабатывает именно этот датчик. На некоторых девайсах возвращается только два значения: «далеко» и «близко».
  • Sensor.TYPE_GYROSCOPE — трехосевой гироскоп, возвращающий скорость вращения устройства по трем осям (радиан в секунду).
  • Sensor.TYPE_MAGNETIC_FIELD — магнитометр, определяющий показания магнитного поля в микротеслах (мкТл) по трем осям (имеется в смартфонах с аппаратным компасом).
  • Sensor.TYPE_PRESSURE — датчик атмосферного давления (по-простому — барометр), который возвращает текущее атмосферное давление в миллибарах (мбар). Если немного вспомнить физику, то, используя значение этого датчика, можно легко вычислить высоту (а ежели вспоминать ну никак не хочется, можно воспользоваться готовым методом getAltitude из объекта SensorManager).
  • Sensor.TYPE_RELATIVE_HUMIDITY — датчик относительной влажности в процентах. Кстати, совместное применение датчиков относительной влажности и давления позволяет предсказывать погоду — конечно, если выйти на улицу. 😉
  • Sensor.TYPE_STEP_COUNTER (с API 19) — счетчик шагов с момента включения устройства (обнуляется только после перезагрузки).
  • Sensor.TYPE_MOTION_DETECT (с API 24) — детектор движения смартфона. Если устройство находится в движении от пяти до десяти секунд, возвращает единицу (по всей видимости, задел для аппаратной функции «антивор»).
  • Sensor.TYPE_HEART_BEAT (с API 24) — детектор биения сердца.
  • Sensor.TYPE_HEART_RATE (с API 20) — датчик, возвращающий пульс (ударов в минуту). Этот датчик примечателен тем, что требует явного разрешения android.permission.BODY_SENSORS в манифесте.
Рис. 1. Система координат датчиков

Перечисленные датчики являются аппаратными и работают независимо друг от друга, часто без всякой фильтрации или нормализации значений. «Для облегчения жизни разработчиков»™ Google ввела несколько так называемых виртуальных сенсоров, которые предоставляют более упрощенные и точные результаты.

Например, датчик Sensor.TYPE_GRAVITY пропускает показания акселерометра через низкочастотный фильтр и возвращает текущие направление и величину силы тяжести по трем осям, а Sensor.TYPE_LINEAR_ACCELERATION использует уже высокочастотный фильтр и получает показатели ускорения по трем осям (без учета силы тяжести).

www-icon.jpg#26759185

WWW

Исчерпывающее описание всех датчиков доступно по ссылке.

При разработке приложения, эксплуатирующего показания сенсоров, вовсе не обязательно бегать по улице или прыгать в воду с высокой скалы, так как эмулятор, входящий в поставку Android SDK, умеет передавать приложению любые отладочные значения (рис. 2–3).

</p>

Ищем датчики

Чтобы узнать, какие сенсоры есть в смартфоне, следует использовать метод getSensorList объекта SensorManager:

List<sensor> s sensorManager.getSensorList(Sensor.TYPE_ALL);</sensor>

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

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

List<sensor> pist = sensorManager.getSensorList(Sensor.TYPE_PRESSURE);</sensor>

вернет все доступные барометрические датчики. Причем аппаратные реализации окажутся в начале списка, а виртуальные — в конце (правило действует для всех типов датчиков).

Рис. 4. Датчики смартфона среднего ценового диапазона

Чтобы получить реализацию датчика по умолчанию (такие датчики хорошо подходят для стандартных задач и сбалансированы в плане энергопотребления), используется метод getDefaultSensor:

Sensor defPressureSensor = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE);

Если для заданного типа датчика существует аппаратная реализация, по умолчанию будет возвращена именно она. Когда нужного варианта нет, в дело вступает виртуальная версия, ну а если, увы, ничего подходящего в девайсе не окажется, getDefaultSensor вернет null .

О том, как самолично выбирать реализацию датчиков по критериям, написано во врезке, мы же плавно двигаемся дальше.

Снимаем показания

Чтобы получать события, генерируемые датчиком, необходимо зарегистрировать реализацию интерфейса SensorEventListener с помощью того же SensorManager. Звучит сложновато, но на практике реализуется одной строчкой:

Sensor defPressureSensor = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE); sensorManager.registerListener(workingSensorEventListener, defPressureSensor, SensorManager.SENSOR_DELAY_NORMAL);

Здесь мы полученный ранее барометр по умолчанию регистрируем с помощью метода registerListener, передавая в качестве второго параметра сенсор, а в качестве третьего — частоту обновления данных.

В классе SensorManager определены четыре статические константы, определяющие частоту обновления:

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

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

Оставшийся нерассмотренным первый параметр представляет собой реализацию интерфейса SensorEventListener, где мы наконец-то получим конкретные цифры:

private final SensorEventListener workingSensorEventListener = new SensorEventListener() {      public void onAccuracyChanged(Sensor sensor, int accuracy) {     }      public void onSensorChanged(SensorEvent event) {         // Получаем атмосферное давление в миллибарах         double pressure = event.values[0];     } };

В метод onSensorChanged передается объект SensorEvent, описывающий все события, связанные с датчиком: event.sensor — ссылка на датчик, event.accuracy — точность значения датчика (см. ниже), event.timestamp — время возникновения события в наносекундах и, самое главное, массив значений event.values. Для датчика давления передается только один элемент, тогда как, например, для акселерометра предусмотрено сразу три элемента для каждой из осей. В следующих разделах мы рассмотрим примеры работы с различными датчиками.

Метод onAccuracyChanged позволяет отслеживать изменение точности передаваемых значений, определяемой одной из констант: SensorManager.SENSOR_STATUS_ACCURACY_LOW — низкая точность, SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM — средняя точность, возможна калибровка, SensorManager.SENSOR_STATUS_ACCURACY_HIGH — высокая точность, SensorManager.SENSOR_STATUS_UNRELIABLE — данные недостоверны, нужна калибровка.

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

sensorManager.unregisterListener(workingSensorEventListener);

Меряем давление и высоту

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

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.

Я уже участник «Xakep.ru»

Datchk-vkl.jpg

Как включить датчик приближения на Андроид. Многие пользователи довольно часто сталкиваются с проблемой, когда экран смартфона не блокируется во время разговора. Или наоборот, дисплей не разблокируется после завершения телефонного разговора. Всему виной датчик приближения. Вернее, неправильная его настройка. В этой статье мы расскажем, как правильно настроить датчик приближения Андроид.

Что такое датчик приближения Андроид?

Датчик приближения – это небольшой элемент устройства, который активируется при физическом сближении телефона и какого-либо предмета. Благодаря правильной работе датчика приближения при разговоре дисплей смартфона гаснет автоматически, как только пользователь подносит его к уху.

Датчик приближения Андроид очень полезен и даже необходим как минимум по двум причинам, а именно:

  1. При отключённом экране во время разговора вы точно не нажмёте случайно какую-либо кнопку на сенсорном экране, к примеру, ухом или щекой
  2. Датчик приближения Андроид позволяет экономить заряд аккумулятора. При включённом во время разговора экране телефона заряд батареи расходовался бы гораздо быстрее, а это крайне неудобно для людей, привыкших или вынужденных подолгу разговаривать по телефону

Датчик приближения находится в верхней части смартфона. Как правило, он размещён рядом с объективом фронтальной камеры. На некоторых устройствах датчик видно невооружённым взглядом, а на некоторых обнаружить его не так уж и просто. Чтобы определить местонахождение датчика приближения, достаточно во время разговора убрать устройство от уха и поднести палец к месту рядом с фронтальной камерой. Если дисплей погас, это означает, что вы нашли датчик.

Datchk-vkl1-stretch-350x261.jpg

Как включить датчик приближения на Андроид?

Обычно, датчик включён по умолчанию, но если он у вас не активен или вы случайно его отключили, то включить датчик приближения Андроид всегда можно снова.

Для этого нужно:

  • Зайти в меню настроек телефона
  • Перейти в раздел «Вызовы»
  • После этого «Входящие вызовы»
  • Далее найти пункт «Датчик приближения»
  • Включить датчик приближения Андроид, активировав галочку

Datchk-vkl2-stretch-220x391.png

Как отключить датчик приближения на Андроид?

Иногда датчик работает некорректно, и для своего удобства некоторые потребители желают его отключить. Сделать это можно очень быстро и просто. Чтобы отключить датчик приближения на Андроид нужно выполнить все пункты вышеуказанной инструкции, но не ставить галочку в поле активации либо убрать ее.

Как настроить датчик приближения на Андроид?

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

Datchk-vkl3-stretch-220x391.jpg

Чтобы настроить датчик приближения на Андроид с помощью данной программы вам нужно:

  • Скачать и установить приложение «Датчик приближения Сброс«
  • После запуска программы нажать Calibrate Sensor
  • Закрыть датчик приближения рукой и выбрать Next
  • Убрать руку и снова выбрать Next
  • После этого нажать Calibrate и Confirm
  • Дать программе доступ к рут-правам. В открывшемся окне кликнуть «Разрешить»
  • Подождать пока устройство перезагрузится
  • Проверить исправность работы датчика

Datchk-vkl4-stretch-400x283.png

Если эти действия не решили проблему, и у вас всё равно не работает датчик приближения, то возможно потребуется сделать калибровку дисплея. О том, как правильно откалибровать дисплей, читайте в нашей статье – Калибровка батареи на Android. Также наладить работу датчика может перепрошивка устройства.

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

Как проверить датчик приближения Андроид с помощью инженерного меню?

Чтобы проверить датчик приближения Андроид с помощью инженерного меню, нужно в меню набора номера ввести комбинацию *#*#3646633#*#*. В открывшемся меню выбрать вкладку Hardware Testing, далее выбрать Sensor и нажать Light/Proximity Sensor. После этого — PS Data Collection, и вы попадёте в меню окна тестирования датчика приближения. Нужно нажать Get One Data, и во второй строчке должна появиться цифра «0». Далее положите руку на датчик приближения и ещё раз нажмите Get One Data, должно появиться число «255». Если у вас всё как в вышеуказанной инструкции, то датчик приближения работает корректно.

proximity-sensor-android-thumb-696x618.jpg

Функциональные возможности смартфонов под управлением Android далеко выходят за рамки совершения звонков и серфинга в интернете. Современные гаджеты куда более универсальны, с их помощью вы можете фотографировать и снимать видео, также мобильные устройства допускается использовать в качестве GPS-навигатора, сканера QR-кодов и документов, пульта управления телевизором и т.д. Такой обширный функционал становится доступным благодаря встроенным аппаратным модулям, с одним из которых, возможно не самым востребованным, мы сегодня познакомимся. Называется он датчик приближения.

Что такое датчик приближения и зачем он нужен на смартфоне

Датчик приближения представляет собой небольшое сенсорное устройство, реагирующее на приближение к какому-либо объекту. Как правило, физически эти датчики располагаются в верхней части лицевой панели устройства, чаще всего рядом cо слуховым динамиком. В смартфонах они используются в основном для автоматического отключения экрана в момент поднесения гаджета к уху. Это не только предотвращает случайное нажатие сенсорных кнопок и вызов ненужных функций, но также позволяет экономить заряд аккумулятора, ведь если бы экран оставался включенным во время разговора, который может продолжаться не одну минуту, батарея садилась бы куда быстрее.

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

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

Как включить или отключить датчик приближения

Использование подобного датчика не является столь необходимым, более того, в определенных обстоятельствах предлагаемый им функционал даже доставляет неудобства владельцу телефона. К счастью, сенсор можно деактивировать. Давайте же посмотрим, как отключить датчик приближения на Андроиде.

В большинстве версий OS Android опция отключения датчика находится в общих настройках. Откройте на своем телефоне «Настройки», зайдите в раздел «Системные приложения» и выберите «Телефон». В списке доступных опций выберите «Входящие вызовы» и установите переключатель «Датчик приближения» в положение «Выкл».

В зависимости от модели смартфона расположение и название нужной настройки может незначительно отличаться. Например, на старых версиях Андроид опция управления датчиком зачастую называется «Отключать экран во время вызова».

proximity-sensor-android-5.jpg

Объяснять, как включить датчик приближения на Андроид, полагаем, особой нужды нет, делается это с помощью той же опции. Впрочем, не исключено, что как раз в вашей модели функции управления датчиком приближения не окажется, хотя сам сенсор будет присутствовать. В таком случае рекомендуем воспользоваться сторонними утилитами вроде Sanity.

proximity-sensor-android-6.jpg

Это приложение служит для управления функционалом «звонилки», поддерживается им и управление датчиком приближения. Чтобы включить/отключить датчик, нужно зайти в раздел «Proximity» и установить либо снять птичку с чекбокса «Turn off in proximity». Также вы можете воспользоваться приложением Smart Screen Off, предназначенным для настройки разных кнопок и датчиков в телефонах Андроид. К сожалению, не все подобные программы работают корректно, после изменения параметров нужно проверить датчик приближения и убедиться, что он действительно включен/выключен.

Калибровка датчика

Датчик приближения – очень точное устройство, и даже малейший сбой может привести к тому, что он станет работать неправильно. Если неполадка проявляется в том, что сенсор срабатывает не вовремя, необходимо выполнить его калибровку.

Штатные средства Андроид

Найти соответствующую опцию можно в общих настройках смартфона. Обычно для этого стоит открыть раздел «Специальные возможности», на некоторых моделях следует зайти в раздел «Экран».

proximity-sensor-android-7.jpg

Процедура калибровки включает три шага. Лучше всего ее проводить, положив смартфон на плоскую поверхность. Сначала мастер предложит вам убрать все предметы перед датчиком, а затем нажать «Пуск». Через несколько секунд вас попросят поднести к датчику на небольшое расстояние (2-3 см) какой-нибудь предмет. Это может быть книга, плотный лист бумаги и т.п. Жмем «Далее» и следуем указаниям мастера, отдаляя и приближая объект к датчику. Через несколько секунд сохраняем настройки нажатием «OK». Если всё пройдет удачно, на экране появится сообщение «Калибровка выполнена успешно».

Инженерное меню

Какой еще имеется способ настроить датчик приближения на Андроиде? Если у вас есть должный опыт, покопайтесь в инженерном меню вашего устройства. Выполнив набор соответствующего вашей модели телефона кода, зайдите в меню, нажмите на вкладке «Hardware Testing» кнопку «Sensor» и выберите пункт «Light/Proximity Sensor».

proximity-sensor-android-8.jpg

Далее последовательно выбираем «PS Calibration – Calibration – Calculate min value». Когда внизу экрана появится сообщение «Calculate succeed», подносим к датчику предмет и нажимаем сначала «Calculate Max value», а затем «Do Calibration». По завершении всех манипуляций перезагружаем устройство.

proximity-sensor-android-9.jpg

Если вы не знаете код входа в инженерное меню смартфона, установите приложение Engineer Mode MTK.

Специальные приложения

Альтернативой штатному инженерному меню выступают сторонние приложения. Одно из них так и называется – «Датчик приближения: Сброс». Установив программу из Маркета, запустите ее и нажмите «Calibrate Sensor». Прикройте датчик рукой или листом бумаги, кликните «Next», затем откройте датчик и нажмите «Next» повторно.

proximity-sensor-android-10.jpg

Теперь жмем кнопку «Calibrate», подтверждаем действие нажатием «Confirm» и перезагружаемся. Использовать это приложение разработчик рекомендует на рутированных устройствах, если у вас нет прав суперпользователя, откалибровать с его помощью датчик приближения, скорее всего, не получится.

proximity-sensor-android-11.jpg

Как быть, если ни один из способов не помог решить проблему? Причины, по которым не удается включить либо отключить, а также откалибровать датчик приближения, в некоторых случаях носят аппаратный характер, и устранить их можно только в сервисном центре. Также источником неполадок часто являются «левые» прошивки гаджета, не поддерживающие должным образом все функции «железа».

Используемые источники:

  • https://xakep.ru/2017/06/06/android-sensors/
  • https://upgrade-android.ru/stati/stati/4020-kak-vklyuchit-datchik-priblizheniya-na-android.html
  • https://viarum.ru/datchik-priblizheniya-android/

Рейтинг автора
5
Подборку подготовил
Андрей Ульянов
Наш эксперт
Написано статей
168
Ссылка на основную публикацию
Похожие публикации