Главная » Разработка для Android » СЕНСОРЫ, КОММУНИКАЦИЯ БЛИЖНЕГО ПОЛЯ, РЕЧЬ, ЖЕСТЫ И ДОСТУПНОСТЬ в Android приложении

0

 

Благодаря нынешнему техническому прогрессу как пользователь, так и окружающая среда могут взаимодействовать с устройством разнообразными способами. Речь идет и о внешних сенсорах, которые способны определять, когда устройство изменяет ориентацию в пространстве, и о сенсорных экранах (тачскринах), воспринимающих сложные жесты, которые могут инициировать событие на устройстве. Android предоставляет такие API, которые позволяют разработчику получать доступ к сенсорам, а пользователю – взаимодействовать с устройством различными интерактивными способами. Мы исследуем некоторые подобные API и поговорим о сенсорах, NFC (коммуникации ближнего поля), библиотеке жестов и доступности устройства.

СЕНСОРЫ

Функционал современного смартфона не ограничивается лишь возможностями, связанными с той или иной входящей или исходящей коммуникацией. После оснащения телефонов внешними сенсорами, которые способны сообщать информацию о той среде, где находится телефон, аппарат стал более мощным и полезным как для пользователя, так и для разработчика. Начиная с версии Android 1.5 (API уровня 3), в телефоне доступен стандартный набор сенсоров. К физическим сенсорам относятся в том числе акселерометр, измеряющий ускорение по различным осям, гироскоп, вычисляющий вращательное изменение вокруг определенных осей, сенсоры магнитного поля, отслеживающие силу магнитных полей по ряду осей, световые сенсоры, измеряющие силу окружающего света, сенсоры близости, определяющие, насколько близко устройство находится к внешнему объекту, температурные сенсоры, измеряющие температуру окружающей среды, а также сенсоры давления, действующие подобно барометру. Величина, непосредственно измеренная каждым из сенсоров, считается результатом «сырых измерений», поэтому ассоциативный сенсор можно считать сенсором необработанных данных (raw sensor). Некоторые сенсоры позволяют комбинировать измерения или собирать их результаты, и расчеты могут производиться над собранными величинами, чтобы получить результаты более сложных измерений. Например, при интеграции величин вращательных изменений, фиксируемых гироскопом, и измерения времени, за которое эти изменения происходят, можно рассчитать вектор вращения. Часто сложные измерения такого рода выполняются комбинированными сенсорами.

Для доступа к набору сенсоров Android предоставляет удобную системную службу, называемую SensorManager. Доступ к этой службе осуществляется при помощи метода getSystemService(), относящегося к классу Context, с аргументом Context.SENSOR_SERVICE. Затем при помощи SensorManager можно обратиться к конкретному сенсору при помощи метода getDefaultSensoK).

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

После получения сенсора или набора сенсоров вы можете активировать их и приступить к получению их данных, зарегистрировав слушатель, который будет принимать такие данные. Данные начнут прибывать с такой частотой, которую вы зададите в качестве аргумента. Эта частота может иметь значение SENSORDELAYNORMAL, SENSOR_DELAY_UI (частота, подходящая для базовых взаимодействий с пользовательским интерфейсом), SENSORDELAYGAME (высокая частота, которая подойдет для большинства игр), SENSOR_DELAY_FASTEST (подача данных сразу же по мере их поступления). Кроме того, задержку между событиями можно указать в миллисекундах:

Два метода SensorEventListener – onAccuracyChangedO и onSensorChanged() – вызываются, когда оказываются доступны данные от интересующего нас сенсора. Метод onAccuracyChanged() вызывается всякий раз, когда у сенсора изменяется уровень точности или-доля погрешности. Метод onSensorChanged(), пожалуй, более интересен, тем, что те данные, которые передает ему сенсор, оказываются обернуты в объект SensorEvent.

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

mngr.unregi sterListener(lіstener);

Пока сенсор включен, объект SensorEvent передается слушателю при помощи метода onSensorChangedO. Именно значения этого объекта SensorEvent – фактор, специфичный для сенсоров каждого типа.

Положение

Координатная система телефона основана на экране и на той ориентации телефона, которая задана по умолчанию. Оси X, Y и Z расположены так, как показано на рис. 16.1, и действуют следующим образом:

ось X – расположена по горизонтали, положительные значения находятся справа, а отрицательные – слева;

ось Y – расположена по вертикали, положительные значения идут вверх, а отрицательные – вниз;

ось Z – положительные значения идут из экрана, вперед, а отрицательные – за экран, назад (начало координат по оси z находится на плоскости экрана).

Рис. 16.1. Координатная система телефона

Когда пользователь перемещает телефон, оси перемещаются вместе с ним и не меняются местами.

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

Акселерометр

Акселерометр измеряет ускорение, прилагаемое к устройству, и возвращает значения по трем осям (значение [0] по оси X, значение [1] по оси У и значение [2] по оси Z). Значения измеряются в единицах системы СИ (м/с2). Необходимо отметить, что сила тяготения не вычитается из возвращаемых значений. Следовательно, когда устройство лежит на столе (например, экраном вверх), значение [2] составит 9,81 м/с2.

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

Гироскоп

Гироскоп измеряет угловую скорость или частоту вращения вдоль трех осей. Все значения исчисляются в рад/с. Вращение против часовой стрелки имеет положительные значения. Наблюдатель, который смотрит на экран устройства как обычно – когда экран расположен в точке (0, 0, 100) в координатной системе устройства, – должен сообщить, что если устройство вращается против часовой стрелки, то его вращение является положительным. Поскольку речь идет об угловой скорости, для расчета угла необходимо интегрировать значения в течение некоторого периода времени:

Поскольку это стандартный набор проблем, Android 2.3 (API уровня 9) поддерживает сенсор для определения вектора вращения. Об этом показателе мы поговорим в следующем пункте.

Вектор вращения

Вектор вращения в Android 2.3 и выше представляет ориентацию устройства как комбинацию угла и оси, под которыми устройство повернулось на угол 0 вокруг оси <х, у. z>. Хотя все это можно рассчитать при помощи гироскопа, многим разработчикам приходится выполнять такие операции довольно часто. И чтобы упростить процедуру использования, Google внедрил концепцию вращения.

Есть три элемента вектора вращения – <x*sin(0/2), y*sin(0/2) и z*sin(0/2)>. Соответственно магнитуда вектора вращения равна sin(0/2), а направление вектора вращения равно направлению оси вращения. Три элемента вектора вращения равны последним трем компонентам единичного кватерниона <cos (0/2), x*sі n (0/2), y*sin(0/2) и z*sin(0/2)>. Элементы вектора вращения являются безразмерными величинами.

Линейное ускорение

В Android 2.3 (API уровня 9) поддерживаются сенсоры еще одного типа, призванные упростить типичные вычисления, связанные с применением акселерометра. Пересылаемое значение – это трехмерный вектор, указывающий ускорение вдоль каждой оси устройства, не учитывая гравитации. Это означает, что результирующие значения равны линейному ускорению по каждой из осей минус воздействие гравитации на эту ось. Таким образом, становится проще исключить эффект воздействия гравитационной постоянной, которая непрерывно воздействует на телефон, используемый на Земле. Все значения измеряются в м/с2.

Гравитация

Значения, получаемые от этого сенсора, составляют трехмерный вектор, указывающий направление и магнитуду гравитации. Этот сенсор также относится к Android 2.3 (API уровня 9) и обеспечивает стандартные вычисления. Все значения измеряются в м/с2.


Другие сенсоры

В Android также поддерживаются следующие сенсоры.

Сенсор света – предоставляет массив из одного значения (значение [0]), выражающий уровень окружающего света в единицах системы СИ – люксах (1х).

Сенсор магнетизма – измеряет силу окружающих магнитных полей в микротеслах (цТ) по осям X, Y и Z.

Сенсор давления – встречается на некоторых устройствах. Если такой сенсор имеется, то его значения исчисляются в килопаскалях (кПа).

Близость – измеряет массив из одного значения (значение [0]), выражающий расстояние от сенсора, измеряемое в сантиметрах. В некоторых случаях сенсор близости может выполнять только бинарное измерение: «близко» (0) или «далеко» (1). В таком случае расстояние, большее или равное, чем значение метода getMaximumRangeO, который относится к сенсору, возвратит результат «далеко», а все остальные значения – результат «близко».

Температура – это еще один сенсор, который встречается на устройствах нечасто. Значения выражаются в градусах по стоградусной шкале Цельсия (С).

Источник: Android. Программирование на Java для нового поколения мобильных устройств

По теме:

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