Android Събира показания от сензори
Главна информация
- Акселерометър (TYPE_ACCELEROMETER)
- Жироскоп (TYPE_GYROSCOPE)
- Сензор за светлина (TYPE_LIGHT)
- Сензор за разстояние (TYPE_PROXIMITY)
- Сензор за магнитно поле (TYPE_MAGNETIC_FIELD)
- Барометър (TYPE_PRESSURE)
- Сензор за околна температура (TYPE_AMBIENT_TEMPERATURE)
- Измервател на относителна влажност (TYPE_RELATIVE_HUMIDITY)
Всеки от представените сензори заслужава отделна статия. Имайте предвид, че има отхвърлени класове за работа със сензори, по-специално за сензори за ориентация и температура.
Има няколко неща, които трябва да имате предвид, когато работите със сензори:
- Показанията са много неравномерни. Трябва да използвате някаква средна стойност на показанията, но не прекалявайте, за да може приложението да остане отзивчиво
- Данните идват неравномерно. Не очаквайте спокоен, плавен поток от данни
- Опитайте се да предвидите бъдещи потребителски действия. Например, ако има данни за началото на въртенето на устройството, можете да предвидите следващото движение и да се подготвите за него
Почти невъзможно е да тествате работата със сензори на емулатора, така че използвайте реални устройства. В най-новите версии на емулаторите списъкът с възможности на сензора се разшири. Вижте разделаВиртуални сензорив настройките на емулатора.
КласътSensorManagerотговаря за работата със сензори, който съдържа няколко константи, които характеризират различни аспекти на сензорната система на Android, включително:
Тип сензор Ориентация, акселерометър, светлина, магнитно поле, близост, температура и др. Скорост на измерване Максимум, Игра, Нормално, Потребителски интерфейс. Когато приложението поискаконкретна стойност на честотата на дискретизация, от гледна точка на сензорната подсистема, това е само препоръка. Няма гаранция, че измерванията ще бъдат направени на посочената честота. Точност Висока, ниска, средна, ненадеждни данни.
Видове сензори
- TYPE_ACCELEROMETER - Измерва ускорението в пространството по осите X, Y, Z
- TYPE_AMBIENT_TEMPERATURE - Нов сензор за измерване на температура (API 14) в градуси по Целзий, който замени остарелияTYPE_TEMPERATURE
- TYPE_GRAVITY- Сензор за гравитация с три оси. Това обикновено е виртуален сензор и е нискочестотен филтър за показанията, върнати от акселерометъра.
- TYPE_GYROSCOPE - Триосен жироскоп, който връща текущата позиция на устройството в пространството в градуси по трите оси. Според други данни той връща скоростта на въртене на устройството по три оси в радиани в секунда.
- TYPE_LIGHT - Измерва количеството светлина. Сензор за околната светлина, който описва околната светлина в луксове. Този тип сензор обикновено се използва за динамична промяна на яркостта на екрана.
- TYPE_LINEAR_ACCELERATION- Сензор за 3-осно линейно ускорение, който връща стойности на ускорението без оглед на гравитацията. Това е виртуален сензор, който използва показанията на акселерометъра.
- TYPE_MAGNETIC_FIELD - Сензор за магнитно поле, който определя текущото магнитно поле в микротесла по три оси.
- TYPE_ORIENTATION- Сензор за ориентация. Измерва панорамите, наклоните и въртенето на устройството
- TYPE_PRESSURE - Сензор за атмосферно налягане (барометър), който връща текущото налягане в милибари. Можете да определите височината над морското равнище, като сравните атмосферното налягане в две точки. Може да се използват и барометрипрогнозиране на времето.
- TYPE_PROXIMITY - Сензор за близост, който сигнализира разстоянието между устройството и целта в сантиметри. Как се избира обектът и какви разстояния се поддържат зависи от хардуерната реализация на този сензор, възможно е да се върнат две стойности - Close и Far. Типичната му употреба е да открие разстоянието между устройството и ухото на потребителя, за да регулира автоматично яркостта на екрана или да изпълни гласова команда.
- TYPE_RELATIVE_HUMIDITY - Сензор за относителна влажност като процентна стойност (API 14)
- TYPE_ROTATION_VECTOR – Връща позицията на устройството в пространството като ъгъл спрямо ос. Виртуален сензор, който взема показания от акселерометъра и жироскопа. Може също да използва показанията на сензора за магнитно поле
- TYPE_GEOMAGNETIC_ROTATION_VECTORе алтернатива наTYPE_ROTATION_VECTOR. По-малко точност, но по-малко консумация на батерия. Въведено в Android 4.4 (API 19)
- TYPE_POSE_6DOFе друга алтернатива наTYPE_ROTATION_VECTOR. Въведено в Android 7.0 (API 24)
- TYPE_SIGNIFICANT_MOTION- Въведено в Android 4.3 (API 18)
- TYPE_MOTION_DETECT- детектор за движение. Въведено в Android 7.0 (API 24)
- TYPE_STATIONARY_DETECT- Въведено в Android 7.0 (API 24)
- TYPE_STEP_COUNTER - сензор за отчитане на броя стъпки
- TYPE_STEP_DETECTOR- откриване на началото на стъпките
- TYPE_HEART_BEAT- пулс. Въведено в Android 7.0 (API 24)
- TYPE_HEART_RATE- сърдечна дейност. Въведено в Android 4.4 (API 20)
- TYPE_LOW_LATENCY_OFFBODY_DETECT- Въведено в Android 8.0 (API 26)
Освен хардуерни сензори, устройствата използватвиртуални сензори, които предоставят опростени, усъвършенствани или комбинирани показания, използвайки комбинация от множество хардуерни сензори. В някои случаи този метод е по-удобен.
За достъп до сензорите трябва да извикате методаgetSystemService().
Едно устройство може да включва множество изпълнения на един и същ тип сензор. За да намерите изпълнението по подразбиране, извикайте методаgetDefaultSensor()от обектаSensorManager, като му предадете типа сензор като параметър под формата на една от константите, описани по-горе.
Следният кодов фрагмент ще върне обект, описващ жироскопа по подразбиране. Ако няма сензор по подразбиране за този тип, ще бъде върнатоnull.
Таблица със стойности, върнати от сензори
Обявете целия списък, моля!
КласътSensorManagerима методgetSensorList(), който ви позволява да получите списък с налични сензори на устройството чрез константатаSensor.TYPE_ALLи методаgetName():
Тъй като всяко устройство има свой собствен набор от сензори, резултатите ще бъдат различни за всеки. По-долу са екранни снимки от емулатора и от реалното устройство. В първия случай бяха показани само 5 сензора, във втория бяха много повече - виждате само частта, която се побира на екрана.


Можете също така да използвате методаgetSensorList(), за да получите списък с налични сензори от определен тип. Следният кодов фрагмент ще върне обектиSensor, представляващи всички налични сензори за налягане:
Интерфейс SensorEventListener - следене на показанията
Ще ви трябва и интерфейсътandroid.hardware.SensorListener. Интерфейсът се реализира с помощта на клас,който се използва за въвеждане на стойности на сензора, тъй като те се променят в реално време. Приложението прилага този интерфейс за наблюдение на един или повече налични хардуерни сензори.
Интерфейсът включва два необходими метода:
- МетодътonSensorChanged(int sensor, float values[])се извиква всеки път, когато стойността на сензора се промени. Този метод се извиква само за сензори, управлявани от това приложение. Аргументите на метода включват цяло число, показващо, че стойността на сензора се е променила, и масив от стойности с плаваща запетая, представляващи действителната стойност на сензора. Някои сензори предоставят само една стойност на данните, докато други предоставят три стойности с плаваща запетая. Сензорите за ориентация и акселерометърът предоставят по три стойности на данни.
- МетодътonAccuracyChanged(int sensor,int accuracy)се извиква, когато точността на показанията на сензора се промени. Аргументите са две цели числа: едното указва сензора, а другото съответства на новата стойност на точността за този сензор.
Сензорната услуга извикваonSensorChanged()всеки път, когато стойностите се променят. Всички сензори връщат масив от стойности с плаваща запетая. Размерът на масива зависи от характеристиките на сензора. СензорTYPE_TEMPERATUREвръща една стойност - температура в градуси по Целзий, други могат да връщат няколко стойности. Можете да използвате само стойностите, от които се нуждаете. Например, за да получите информация само за магнитния азимут, е достатъчно да използвате първото число, върнато от сензораTYPE_ORIENTATION.
Параметърътaccuracy, използван в методите за представяне на степента на точност на сензора, използва една от константите
- SensorManager.SENSOR_STATUS_ACCURACY_LOW. Показва, че данните, предоставени от сензора, са с ниска точност и трябва да бъдат калибрирани.
- SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM. Показва средната степен на точност на сензора и факта, че калибрирането може да подобри резултата.
- SensorManager.SENSOR_STATUS_ACCURACY_HIGH. Показанията на сензора са възможно най-точни.
- SensorManager.SENSOR_STATUS_UNRELIABLE. Данните, предоставени от сензора, са невалидни. Това означава, че сензорът трябва да бъде калибриран, в противен случай е невъзможно да се разчетат резултатите.
За да получавате събития, генерирани от сензори, регистрирайте своята реализация на интерфейсаSensorEventListenerсSensorManager. Посочете обектаSensor, който искате да наблюдавате и колко често искате да получавате актуализации.
След получаване на обекта извиквате методаregisterListener()в методаonResume(), за да започнете да получавате актуализирани данни, и извикватеunregisteredListener()в методаonPause(), за да спрете да получавате данни. В този случай сензорите ще се използват само когато активността се вижда на екрана.
Следващият пример показва как да регистрирате SensorEventListener за сензор за близост по подразбиране със скорост на актуализиране по подразбиране:
Класът SensorManager съдържа следните константи за избор на подходяща честота на актуализиране (в низходящ ред):
- SensorManager.SENSOR_DELAY_FASTEST— най-високата възможна скорост на актуализиране на показанията на сензора;
- SensorManager.SENSOR_DELAY_GAME- честота, използвана за управление на игрите;
- SensorManager.SENSOR_DELAY_NORMAL—скорост на актуализиране по подразбиране;
- SensorManager.SENSOR_DELAY_UI- честота за актуализиране на потребителския интерфейс.
Избраната от вас честота не е задължително да бъде спазена.SensorManagerможе да върне резултати по-бързо или по-бавно, отколкото сте посочили (въпреки че това обикновено е по-бързо). За да минимизирате консумацията на ресурси, когато използвате сензори в приложение, трябва да се опитате да изберете най-ниската честота.
Динамични сензори
Android 7.0 Nougat (API 24) представи концепцията за динамични сензори, предназначени за платформата Android Things. Сензорите могат да се прикрепят и отделят от платката по всяко време.
За определяне на наличните динамични сензори се използват методитеisDynamicSensorDiscoverySupported(),isDynamicSensor(),getDynamicSensorList().