Датчики Master Android: аппаратные, программные и многомерные

Автор: John Stephens
Дата создания: 26 Январь 2021
Дата обновления: 5 Июль 2024
Anonim
Системы автоматизации и диспетчеризации CAREL
Видео: Системы автоматизации и диспетчеризации CAREL

Содержание


Сегодня большинство современных устройств на Android оснащено множеством датчиков.

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

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

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


Какие датчики Android можно использовать?

Датчики Android можно разделить на следующие категории:

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

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

Кроме того, датчики могут быть:

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

Датчики окружающей среды: измерение окружающего освещения

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


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

Создайте новый проект Android с настройками по вашему выбору, и начнем!

Отображение данных вашего датчика

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

Откройте файл activity_main.xml вашего проекта и добавьте следующее:

Далее нам нужно создать строковый ресурс «light_sensor», на который есть ссылка в нашем макете. Откройте файл strings.xml вашего проекта и добавьте следующее:

Датчик освещенности:% 1 $ .2f

«% 1 $ .2f» - это заполнитель, который указывает информацию, которую мы хотим отобразить, и способ ее форматирования:

  • %1. Вы можете вставить несколько заполнителей в один и тот же строковый ресурс; «% 1» означает, что мы используем один заполнитель.
  • $.2. Это определяет, как наше приложение должно форматировать каждое входящее значение с плавающей запятой. «$ .2» указывает, что значение должно быть округлено до двух десятичных знаков.
  • F. Отформатируйте значение как число с плавающей запятой.

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

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

Пока у нас открыт файл strings.xml, давайте создадим строку «no_sensor», которую мы будем отображать, если датчик освещения недоступен:

Датчик освещенности недоступен

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

Теперь ваше приложение может быть загружено только на устройства с датчиком компаса.

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

Связь с датчиком: SensorManager, SensorEvents и слушатели

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

1. Получить экземпляр SensorManager

SensorManager предоставляет все методы, необходимые для доступа ко всему спектру датчиков устройства.

Для начала создайте переменную, которая будет содержать экземпляр SensorManager:

частный SensorManager lightSensorManager;

Затем вам нужно получить экземпляр SensorManager, вызвав метод Context.getSystemService и передав аргумент Context.SENSOR_SERVICE:

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

2. Получить ссылку на lightTextView

Далее нам нужно создать закрытую переменную-член, которая будет содержать наши объекты TextView, и назначить ее нашему TextView:

частный TextView lightTextView; ... ... ... lightTextView = (TextView) findViewById (R.id.lightTextView);

3. Проверьте, существует ли датчик на текущем устройстве

Вы можете получить доступ к определенному датчику, вызвав метод getDefaultSensor (), а затем передав ему соответствующий датчик. Константа типа для датчика освещенности - TYPE_LIGHT, поэтому нам нужно использовать следующее:

lightSensor = lightSensorManager.getDefaultSensor (Sensor.TYPE_LIGHT);

Если датчик не существует на этом устройстве, метод getDefaultSensor () вернет значение null, и мы выведем строку «no_sensor»:

String sensor_error = getResources (). GetString (R.string.no_sensor); if (lightSensor == null) {lightTextView.setText (sensor_error); }}

4. Зарегистрируйте ваши сенсорные слушатели

Каждый раз, когда датчик получает новые данные, Android генерирует объект SensorEvent. Этот объект SensorEvent включает в себя датчик, который сгенерировал событие, временную метку и новое значение данных.

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

Чтобы гарантировать, что наше приложение уведомлено об этих объектах SensorEvent, нам нужно зарегистрировать прослушиватель для этого конкретного события датчика с помощью метода SensorLanager registerListener ().

Метод registerListener () принимает следующие аргументы:

  • Приложение или Контекст деятельности.
  • Тип датчика, который вы хотите контролировать.
  • Скорость, с которой датчик должен отправлять новые данные. Более высокая скорость предоставит вашему приложению больше данных, но также будет использовать больше системных ресурсов, особенно время автономной работы. Чтобы сохранить заряд батареи устройства, вам следует запросить минимальный объем данных, необходимый для вашего приложения. Я собираюсь использовать SensorManager.SENSOR_DELAY_NORMAL, который отправляет новые данные один раз каждые 200 000 микросекунд (0,2 секунды).

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

Вместо этого вы должны зарегистрировать свои датчики в методе жизненного цикла приложения onStart ():

@ Override protected void onStart () {super.onStart (); // Если датчик доступен на текущем устройстве ... // if (lightSensor! = Null) {// ...... затем начать прослушивание // lightSensorManager.registerListener (this, lightSensor, SensorManager.SENSOR_DELAY_NORMAL); }}

5. Реализуйте обратные вызовы SensorEventListener.

SensorEventListener - это интерфейс, который получает уведомления от SensorManager
всякий раз, когда доступны новые данные или изменяется точность датчика.

Первый шаг - изменение сигнатуры нашего класса для реализации интерфейса SensorEventListener:

Открытый класс MainActivity расширяет AppCompatActivity, реализует SensorEventListener {

Затем нам нужно реализовать следующие методы обратного вызова:

onSensorChanged ()

Этот метод вызывается в ответ на каждое новое событие SensorEvent.

Данные датчика часто могут быстро меняться, поэтому ваше приложение может регулярно вызывать метод onSensorChanged (). Чтобы обеспечить бесперебойную работу приложения, вы должны выполнять как можно меньше работы внутри метода onSensorChanged ().

@Override public void onSensorChanged (SensorEvent sensorEvent) {// Делать //}

onAccuracyChanged ()

Если точность датчика улучшится или уменьшится, то Android вызовет метод onAccuracyChanged () и передаст ему объект Sensor, содержащий новое значение точности, например SENSOR_STATUS_UNRELIABLE или SENSOR_STATUS_ACCURACY_HIGH.

Датчик освещенности не сообщает об изменениях точности, поэтому я оставлю функцию обратного вызова onAccuracyChanged () пустой:

@Override public void onAccuracyChanged (Sensor sensor, int i) {// Делать //}}

6. Получить значение датчика

Всякий раз, когда у нас есть новое значение, нам нужно вызвать метод onSensorChanged () и извлечь строку «light_sensor». Затем мы можем переопределить текст заполнителя строки (% 1 $ .2f) и отобразить обновленную строку как часть нашего TextView:

@Override public void onSensorChanged (SensorEvent sensorEvent) {// Текущее значение датчика // float currentValue = sensorEvent.values; // Извлекаем строку «light_sensor», вставляем новое значение и отображаем его для пользователя // lightTextView.setText (getResources (). GetString (R.string.light_sensor, currentValue)); }

7. Отмените регистрацию ваших слушателей.

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

Чтобы прекратить прослушивание событий датчика, когда ваше приложение находится в фоновом режиме, добавьте unregisterListener () в метод жизненного цикла вашего проекта onStop ():

@ Override protected void onStop () {super.onStop (); lightSensorManager.unregisterListener (это); }

Обратите внимание, что вы не должны отменять регистрацию слушателей в onPause (), так как в Android 7.0 и более поздних версиях приложения могут работать в режиме разделенного экрана и «картинка в картинке», когда они находятся в состоянии паузы, но остаются видимыми на экране.

Использование датчиков освещенности Android: завершенный код

После выполнения всех вышеперечисленных шагов MainActivity вашего проекта должно выглядеть примерно так:

import android.support.v7.app.AppCompatActivity; импорт android.os.Bundle; импорт android.content.Context; импорт android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; импорт android.hardware.SensorManager; import android.widget.TextView; открытый класс MainActivity расширяет AppCompatActivity // Реализует интерфейс SensorEventListener // внедряет SensorEventListener {// Создаем переменные // private Sensor lightSensor; частный SensorManager lightSensorManager; частный TextView lightTextView; @Override protected void onCreate (Bundle saveInstanceState) {super.onCreate (сохраненныйInstanceState); setContentView (R.layout.activity_main); lightTextView = (TextView) findViewById (R.id.lightTextView); // Получить экземпляр SensorManager // lightSensorManager = (SensorManager) getSystemService (Context.SENSOR_SERVICE); // Проверка датчика освещенности // lightSensor = lightSensorManager.getDefaultSensor (Sensor.TYPE_LIGHT); // Если датчик освещенности не существует, отобразить ошибку // String sensor_error = getResources (). GetString (R.string.no_sensor); if (lightSensor == null) {lightTextView.setText (sensor_error); }} @Override protected void onStart () {super.onStart (); // Если датчик доступен на текущем устройстве ... // if (lightSensor! = Null) {//… .then зарегистрировать слушателя // lightSensorManager.registerListener (this, lightSensor, // Укажите, как часто вы хотите получить новые данные // SensorManager.SENSOR_DELAY_NORMAL); }} @Override protected void onStop () {super.onStop (); // Отмена регистрации вашего слушателя // lightSensorManager.unregisterListener (this); } @Override public void onSensorChanged (SensorEvent sensorEvent) {// Текущее значение датчика // float currentValue = sensorEvent.values; // Получаем строку «light_sensor», вставляем новое значение и обновляем TextView // lightTextView.setText (getResources (). GetString (R.string.light_sensor, currentValue)); } @Override // Если точность датчика изменяется… .// public void onAccuracyChanged (Sensor sensor, int i) {// TO DO //}}

Протестируйте ваше законченное приложение Android Sensor

Чтобы проверить это приложение на физическом смартфоне или планшете Android:

  • Установите проект на свое устройство (выбрав «Выполнить> Выполнить» на панели инструментов Android Studio).
  • Хотя это зависит от устройства, датчик освещенности часто находится в правом верхнем углу экрана. Чтобы манипулировать уровнями освещенности, переместите свое устройство ближе, а затем дальше от источника света. Кроме того, вы можете попробовать закрыть устройство рукой, чтобы заблокировать свет. Значение «Датчик света» должно увеличиваться и уменьшаться в зависимости от количества доступного света.

Если вы используете виртуальное устройство Android (AVD), то эмулятор имеет набор виртуальных сенсорных элементов управления, которые вы можете использовать для имитации различных сенсорных событий. Доступ к этим виртуальным сенсорам осуществляется через окно «Расширенные элементы управления» эмулятора:

  • Установите приложение на свой AVD.
  • Наряду с AVD, вы увидите полосу кнопок. Найдите трехточечную кнопку «Дополнительно» (там, где курсор расположен на следующем снимке экрана) и нажмите ее. Откроется окно «Расширенные элементы управления».

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

  • Найдите ползунок «Свет (люкс)» и перетащите его влево и вправо, чтобы изменить уровень имитации света. Ваше приложение должно отображать эти изменяющиеся значения в режиме реального времени.

Вы можете скачать готовый проект с GitHub.

Измерение расстояния с помощью датчиков приближения Android

Теперь мы увидели, как получать информацию с датчика окружающей среды, давайте посмотрим, как вы примените эти знания к позиция Датчик.

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

Создание пользовательского интерфейса

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

Затем откройте файл strings.xml и создайте строку «бесконтактный_сенсор». Еще раз, эта строка должна содержать заполнитель, который в конечном итоге будет заполнен данными, извлеченными из датчика приближения:

Датчик приближения Датчик приближения:% 1 $ .2f Датчик приближения недоступен

Получение данных от датчика приближения

Как и датчик освещенности, датчик приближения Android возвращает одно значение данных, что означает, что мы можем использовать большую часть кода из нашего предыдущего приложения. Тем не менее, есть несколько существенных отличий, а также некоторые изменения, связанные с именами, которые облегчают выполнение этого кода:

  • Создайте экземпляр SensorManager, который на этот раз я назову «бесконтактным менеджером».
  • Получите экземпляр «бесконтактного менеджера».
  • Создайте ссылку на «бесконтактный вид».
  • Вызовите метод getDefaultSensor () и передайте ему датчик TYPE_PROXIMITY.
  • Зарегистрируйте и отмените регистрацию слушателей для датчика приближения.

После внесения этих изменений вы должны получить следующее:

import android.support.v7.app.AppCompatActivity; импорт android.os.Bundle; импорт android.content.Context; импорт android.hardware.Sensor; import android.hardware.SensorEvent; импорт android.hardware.SensorManager; import android.hardware.SensorEventListener; import android.widget.TextView; открытый класс MainActivity расширяет AppCompatActivity // Реализует интерфейс SensorEventListener // внедряет SensorEventListener {// Создаем ваши переменные // private Sensor бесконтактный датчик; частный SensorManager близостиSensorManager; приватный TextView бесконтактный вид текста; @Override protected void onCreate (Bundle saveInstanceState) {super.onCreate (сохраненныйInstanceState); setContentView (R.layout.activity_main); desireTextView = (TextView) findViewById (R.id.proximityTextView); // Получение экземпляра SensorManager // бесконтактный_сенсорManager = (SensorManager) getSystemService (Context.SENSOR_SERVICE); // Проверка на датчик приближения // бесконтактный_крестность_сенсора = близостиСенсорManager.getDefaultSensor (Sensor.TYPE_PROXIMITY); // Если датчик приближения не существует, отображаем ошибку // String sensor_error = getResources (). GetString (R.string.no_sensor); if (desireSensor == null) {desireTextView.setText (sensor_error); }} @Override protected void onStart () {super.onStart (); // Если датчик доступен на текущем устройстве ... // if (близостиSensor! = Null) {//...then зарегистрировать прослушиватель // бесконсенсорManager.registerListener (this, близостиSensor, // указать, как часто вы хотите получить новые данные // SensorManager.SENSOR_DELAY_NORMAL); }} @Override protected void onStop () {super.onStop (); // Отмените регистрацию слушателя, чтобы сохранить системные ресурсы. // бесконтактный_центр.unregisterListener (this); } @Override public void onSensorChanged (SensorEvent sensorEvent) {// Текущее значение датчика // float currentValue = sensorEvent.values; // Извлекаем строку «desire_sensor», вставляем новое значение и обновляем TextView // бесконтактный текст.setText (getResources (). GetString (R.string.proximity_sensor, currentValue)); } @Override // Если точность датчика изменяется… .// public void onAccuracyChanged (Sensor sensor, int i) {//...TO DO //}}

Тестирование: насколько близко пользователь к своему устройству?

Чтобы проверить это приложение на физическом смартфоне или планшете Android, установите приложение на свое устройство, а затем поэкспериментируйте, подведя руку к экрану, а затем снова отодвинув его. Значение «Датчик приближения» должно записывать ваши движения.

Просто помните, что датчики приближения могут различаться в зависимости от устройства. Некоторые устройства могут отображать только два значения близости - одно для обозначения «Рядом» и одно для «Далеко» - поэтому не удивляйтесь, если вы не увидите большого разнообразия на своем физическом устройстве Android.

Чтобы проверить это приложение на эмуляторе:

  • Установите свое приложение на AVD.
  • Найдите трехточечную кнопку «Дополнительно» и нажмите ее, после чего откроется окно «Расширенные элементы управления».
  • В левом меню окна выберите «Виртуальные датчики».
  • Выберите вкладку «Дополнительные датчики».
  • Найдите ползунок «Близость» и перетащите его влево и вправо, чтобы имитировать объект, приближающийся к устройству, а затем еще дальше. Значения «датчика приближения» должны изменяться при манипулировании с ползунком.

Вы можете скачать готовый проект с GitHub.

Датчики движения: обработка многомерных массивов

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

Датчики движения могут помочь вам:

  • Предоставить альтернативный метод ввода пользователя. Например, если вы разрабатываете мобильную игру, пользователь может перемещать своего персонажа по экрану, наклоняя свое устройство.
  • Предотвратить активность пользователя. Если вы создали приложение для отслеживания активности, то датчики движения помогут вам определить, путешествует ли пользователь в машине, бегает трусцой или сидит за своим столом.
  • Точнее определить ориентацию.Можно извлечь координаты из датчиков движения устройства, а затем перевести их на основе системы координат Земли, чтобы получить наиболее точное представление о текущей ориентации устройства.

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

Мы создадим приложение, которое использует датчик вектора вращения для измерения:

  • Подача. Это наклон устройства сверху вниз.
  • Рулон. Это наклон устройства слева направо.

Отображение данных тангажа в реальном времени

Поскольку мы измеряем две метрики, нам нужно создать два TextView и два соответствующих строковых ресурса:

Откройте файл strings.xml и добавьте следующее:

MotionSensors Датчик шага:% 1 $ .2f Датчик крена:% 1 $ .2f Датчик движения недоступен

Использование датчика вектора вращения в вашем приложении

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

1. Используйте TYPE_ROTATION_VECTOR

Поскольку мы работаем с датчиком вектора вращения, нам нужно вызвать метод getDefaultSensor () и передать ему константу TYPE_ROTATION_VECTOR:

positionSensorManager.getDefaultSensor (Sensor.TYPE_ROTATION_VECTOR);

2. Переведите данные датчика

В отличие от предыдущих датчиков освещенности и приближения, датчики движения возвращают многомерные массивы значений датчиков для каждого SensorEvent. Эти значения форматируются с использованием стандартной системы координат «X, Y, Z», которая рассчитывается относительно устройства, когда оно удерживается в его «естественной» ориентации по умолчанию.

Android не переключает эти координаты X, Y и Z в соответствии с текущей ориентацией устройства, поэтому ось «Х» останется неизменной независимо от того, находится ли устройство в портретном или альбомном режиме. При использовании датчика вектора вращения может потребоваться преобразовать входящие данные в соответствии с текущим вращением устройства.

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

Во-первых, система координат устройства представляет собой стандартную трехосную систему координат X, Y, Z, где каждая точка на каждой из трех осей представлена ​​трехмерным вектором. Это означает, что нам нужно создать массив из 9 значений с плавающей запятой:

float вращениеMatrix = новый float;

Затем мы можем передать этот массив в метод getRotationMatrix ():

SensorManager.getRotationMatrixFromVector (вращение Матрица, векторы); int worldAxisX = SensorManager.AXIS_X; int worldAxisZ = SensorManager.AXIS_Z;

Следующим шагом будет использование метода SensorManager.remapCoordinateSystem () для переназначения данных датчика на основе текущей ориентации устройства.

Метод SensorManager.remapCoordinateSystem () принимает следующие аргументы:

  • Исходная матрица вращения.
  • Оси, которые вы хотите переназначить.
  • Массив, который вы заполняете этими новыми данными.

Вот код, который я буду использовать в своем приложении:

float AdjustRotationMatrix = новый float; SensorManager.remapCoordinateSystem (вращениеMatrix, worldAxisX, worldAxisZ, настроитьRotationMatrix);

Наконец, мы будем вызывать SensorManager.getOrientation и сообщать ему о том, что нужно использовать fixedRotationMatrix:

SensorManager.getOrientation (AdjustRotationMatrix, ориентация);

3. Обновите строки заполнителя

Поскольку у нас есть два набора данных (pitch and roll), нам нужно извлечь две отдельные строки-заполнители, заполнить их правильными значениями и затем обновить соответствующий TextView:

pitchTextView.setText (getResources (). getString (R.string.pitch_sensor, pitch)); rollTextView.setText (getResources (). getString (R.string.roll_sensor, roll));

Отображение данных нескольких датчиков: завершенный код

После выполнения вышеуказанных шагов ваша MainActivity должна выглядеть примерно так:

импорт android.app.Activity; импорт android.os.Bundle; импорт android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; импорт android.hardware.SensorManager; import android.widget.TextView; открытый класс MainActivity расширяет Activity реализует SensorEventListener {private SensorManager motionSensorManager; Частный датчик движения датчика; частный TextView pitchTextView; приватный TextView rollTextView; приватный статический финал int SENSOR_DELAY = 500 * 1000; приватная статическая финальная int FROM_RADS_TO_DEGS = -57; @Override protected void onCreate (Bundle saveInstanceState) {super.onCreate (сохраненныйInstanceState); setContentView (R.layout.activity_main); pitchTextView = (TextView) findViewById (R.id.pitchTextView); rollTextView = (TextView) findViewById (R.id.rollTextView); try {motionSensorManager = (SensorManager) getSystemService (Activity.SENSOR_SERVICE); motionSensor = motionSensorManager.getDefaultSensor (Sensor.TYPE_ROTATION_VECTOR); motionSensorManager.registerListener (this, motionSensor, SENSOR_DELAY); } catch (Exception e) {pitchTextView.setText (R.string.no_sensor); rollTextView.setText (R.string.no_sensor); }} @Override public void onAccuracyChanged (датчик датчика, точность int) {// To to //} @Override public void onSensorChanged (событие SensorEvent) {if (event.sensor == motionSensor) {update (event.values); }} private void update (float vectors) {// Вычислить матрицу вращения // float вращениеMatrix = new float; SensorManager.getRotationMatrixFromVector (вращение Матрица, векторы); int worldAxisX = SensorManager.AXIS_X; int worldAxisZ = SensorManager.AXIS_Z; // Перераспределяем матрицу на основе текущей ориентации Деятельности // float AdjustRotationMatrix = new float; SensorManager.remapCoordinateSystem (вращениеMatrix, worldAxisX, worldAxisZ, настроитьRotationMatrix); // Вычисляем ориентацию устройства // float Ориентация = new float; // Предоставляем массив значений с плавающей точкой для метода getOrientation () // SensorManager.getOrientation (AdjustRotationMatrix, direction); шаг плавания = ориентация * FROM_RADS_TO_DEGS; поплавок = ориентация * FROM_RADS_TO_DEGS; // Обновляем TextViews значениями pitch and roll // pitchTextView.setText (getResources (). GetString (R.string.pitch_sensor, pitch)); rollTextView.setText (getResources (). getString (R.string.roll_sensor, roll)); }}

Вы можете скачать готовый проект с GitHub.

Тестирование нашего окончательного приложения для сенсора Android

Чтобы протестировать это приложение Android-датчика вращения на физическом смартфоне или планшете Android:

  • Установите приложение на свое устройство.
  • Положите ваш смартфон или планшет на ровную поверхность. Обратите внимание, что датчики движения чрезвычайно чувствительны, поэтому устройство, которое кажется неподвижным, нередко сообщает о колебаниях значений шага и крена.
  • Чтобы проверить высоту тона, поднимите нижнюю часть устройства, чтобы оно отклонялось от вас. Значение шага должно резко измениться.
  • Чтобы проверить рулон, попробуйте поднять левую сторону вашего устройства, чтобы он наклонился влево - следите за этим значением рулона!

Если вы тестируете свой проект на эмуляторе:

  • Установите приложение на свой AVD.
  • Выберите «More», чтобы открыть окно «Extended Controls».
  • В левом меню выберите «Виртуальные датчики».
  • Убедитесь, что выбрана вкладка «Акселерометр». Эта вкладка содержит элементы управления, которые могут имитировать изменения в положении и ориентации устройства.
  • Попробуйте поэкспериментировать с различными ползунками (вращение: Z-Rot, X-Rot, Y-Rot; и Move: X, Y и Z) и различными кнопками «Device Rotation», чтобы увидеть, как они влияют на «Датчик вращения» вашего приложения. »И« Датчик шага ».

Завершение

В этой статье мы увидели, как извлекать данные из трех основных категорий сенсоров Android: окружение, положение и движение и как отслеживать эти данные в режиме реального времени.

Вы видели какие-нибудь приложения для Android, которые используют сенсоры интересным или уникальным способом? Дайте нам знать в комментариях ниже!

Выпущен OnePlu 7 Pro, и он остается одной из лучших сделок в индустрии смартфонов. У него тонны высококлассного оборудования, включая экран без рамки, самый быстрый мобильный процессор, много оператив...

OnePlu 7 Pro является свидетельством того, как далеко продвинулась компания - от того, чтобы быть флагманом-убийцей до того, чтобы стать флагманом, которого хотят убить другие компании. Это становится...

Увлекательные публикации