Главная » Разработка для Android » Поиск датчиков

0

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

Следующий фрагмент  кода вернет объект, описывающий гироскоп по умолчанию. Если для данного типа не существует датчика по умолчанию, будет возвращено значение null.

Sensor defaultGyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_ GYROSCOPE);

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

List<Sensor> pressureSensors = sensorManager.getSensorList(Sensor.TYPE_ PRESSURE);

Чтобы получить все датчики, доступные на устройстве, используйте метод getSensorList, передавая  ему константу  Sensor.TYPE_ALL, как по- казано ниже:

List<Sensor> allSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);

Данный подход позволит обнаружить все датчики и их типы, доступные на устройстве.

Использование датчиков

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

Реализуйте интерфейс SensorEventListener. Используйте onSensorChanged для отслеживания значений, возвращаемых датчиком, и onAccuracyChanged для реагирования на изменения в их точности.

Листинг 14.1. Каркас для реализации SensorEventListener

final SensorEventListener mySensorEventListener = new

SensorEventListener() {

public void onSensorChanged(SensorEvent sensorEvent) {

// TODO Отслеживать изменения в показаниях датчиков.

}

public void onAccuracyChanged(Sensor sensor, int accuracy) {

// TODO Реакция на изменения в точности значений, выдаваемых датчиками.

}

};

Параметр  SensorEvent, который  передается  в метод onSensorChanged, содержит четыре свойства, описывающих событие, связанное  с датчиком.

sensor. Объект Sensor, инициировавший событие.

accuracy. Точность  датчика  во время поступления события  (низкая, средняя, высокая или недостоверная, о чем пойдет речь в следующем маркированном списке).

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

timestamp. Время  возникновения события,  связанного  с датчиком

(в наносекундах).

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

значение accuracy для представления степени точности датчика с помощью одной из констант.

SensorManager.SENSOR_STATUS_ACCURACY_LOW. Говорит о том, что данные, предоставляемые датчиком,  имеют низкую точ- ность и нуждаются в калибровке.

SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM. Говорит о средней  степени  точности  датчика  и том, что калибровка может улучшить результат.

SensorManager.SENSOR_STATUS_ACCURACY_HIGH. Показатели датчика точны настолько, насколько это возможно.

SensorManager.SENSOR_STATUS_UNRELIABLE. Данные,  предо- ставляемые  датчиком, недостоверны. Это значит, что датчик необхо- димо откалибровать, иначе невозможно считывать результаты.

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

Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);

sensorManager.registerListener(mySensorEventListener, sensor, SensorManager.SENSOR_DELAY_NORMAL);

Класс SensorManager содержит следующие константы для выбора под- ходящей частоты обновлений (в порядке убывания):

SensorManager.SENSOR_DELAY_FASTEST — самая  высокая  воз- можная частота обновления показаний датчиков;

SensorManager.SENSOR_DELAY_GAME — частота, используемая для управления играми;

SensorManager.SENSOR_DELAY_NORMAL — частота обновлений по умолчанию;

SensorManager.SENSOR_DELAY_UI — частота  для  обновления пользовательского интерфейса.

Выбранная вами частота необязательно будет соблюдаться; SensorManager может возвращать результаты быстрее или медленней, чем вы указали (хотя, как правило, это происходит быстрее). Чтобы минимизировать расход ре- сурсов при использовании датчиков в приложении, необходимо пытаться подбирать наиболее низкую частоту.

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

sensorManager.unregisterListener(mySensorEventListener);

Хорошее решение — регистрировать и отменять регистрацию Sen- sorEventListener в методах onResume и onPause Активности. Благодаря это- му датчики будут использоваться только тогда, когда Активность видна на экране.

Интерпретация данных, полученных с помощью датчиков

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

Подробная информация приводится в табл. 14.1. Использование аксе- лерометра, датчиков ориентации  и магнитного поля более подробно будет рассмотрено  в следующих разделах.

ПРИМЕЧАНИЕ

Документацию, в которой описываются значения, возвращаемые каж- дым типом датчиков, а также некоторые дополнительные комментарии вы можете найти по адресу http://developer.android.com/reference/ android/hardware/Sensor.html.

Таблица 14.1. Значения, возвращаемые датчиками

Датчик

Количество значений

Содержание  значений

Комментарий

TYPE_ ACCELEROMETER

3

value[0] : Lateral value[1] : Longitudinal value[2] : Vertical

Ускорение  в м/с2 по трем осям. SensorManager содержит набор констант вида SensorManager. GRAVITY_*

TYPE_GYROSCOPE

3

value[0] : Azimuth value[1] : Pitch value[2] : Roll

Положение устройства  в про- странстве в градусах по трем осям

TYPE_  LIGHT

1

value[0] : Illumination

Измеряется в люксах. SensorManager содержит набор констант для представления разных стандартных  степеней освещенности, имеющих вид SensorManager.LIGHT_*

TYPE_MAGNETIC_ FIELD

3

value[0] : Lateral value[1] : Longitudinal value[2] : Vertical

Внешнее магнитное поле, изме- ряющееся в микротеслах (?T)

Датчик

Количество значений

Содержание  значений

Комментарий

YPE_ORIENTATION

3

value[0] : Azimuth value[1] : Roll value[2] : Pitch

Положение устройства  в про- странстве в градусах по трем осям

TYPE_PRESSURE

1

value[0] : Pressure

Измеряется

в килопаскалях (кПа)

TYPE_PROXIMITY

1

value[0] : Distance

Измеряется в метрах

TYPE_ TEMPERATURE

1

value[0] : Temperature

Измеряется в градусах Цельсия

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии