Северный (Арктический) федеральный университет им. М.В. Ломоносова
Опубликован: 10.04.2014 | Доступ: свободный | Студентов: 6824 / 1221 | Длительность: 14:18:00
Специальности: Программист
Лекция 5:

Использование возможностей смартфона в приложениях

9.5 Использование встроенной камеры

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

  1. непосредственное обращение к камере;
  2. использование намерений (Intent) для вызова существующего приложения.

Рассмотрим основные относящиеся к делу классы:

Camera - класс, реализующий управление камерами устройства. Этот класс используется для получения фотографий или записи видео при создании приложения, работающего с камерой.
SurfaceView - класс, используемый для предоставления пользователю возможности предварительного просмотра.
MediaRecorder - класс, используемый для записи видео с камеры.
Intent - класс, содержащий абстрактное описание выполняемой операции, которое передается системе Android, а ОС сама находит и запускает необходимое приложение и возвращает результат его работы. Для работы с камерой используются два типа намерений:
  • MediaStore.ACTION_IMAGE_CAPTURE - для запроса на выполнение фотоснимков;
  • MediaStore.ACTION_VIDEO_CAPTURE - для запроса на запись видео.

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

9.6 Взаимодействие с системами позиционирования

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

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

  • Во-первых, смартфон постоянно связывается с сотовой вышкой, в зоне действия которой он находится. Каждая сотовая вышка в мире имеет уникальный идентификатор, называемый идентификатором соты (Cell ID), а также для нее точно известны широта и долгота ее расположения. В связи с этим, смартфон, зная идентификатор соты, в которой он находится, может получить географические координаты центра этой соты. Радиусы сот варьируются в зависимости от того, насколько активный сетевой трафик ожидается в конкретном районе. Разумеется, такой способ позиционирования дает очень приблизительные результаты, что называется: "плюс-минус трамвайная остановка".
  • Во-вторых, чаще всего смартфон оказывается в зоне действия более, чем одной сотовой вышки. В современных мобильных технологиях, начиная с поколения 2G, сотовая вышка может определить, с какого направления приходит сигнал. В случае, когда телефон находится в зоне действия двух или трех сотовых вышек, они могут выполнять триангуляцию его местоположения. Телефон может запросить у сети информацию о том, где он находится. Такая техника определения местоположения может быть очень точной и не требует установки дополнительного оборудования.

Дополнительно к возможностям определения местоположения, доступным обычным мобильным телефонам, большинство смартфонов укомплектованы спутниковыми системами глобального позиционирования (Global Positioning System, GPS). В настоящее время наиболее распространенными в мире системами глобального спутникового позиционирования являются: GPS, разработанная и реализованная в США, и система ГЛОНАСС (Глобальная навигационная спутниковая система), советская, а позже российская спутниковая система навигации. Многие смартфоны могут использовать сигналы сразу от двух навигационных систем, что позволяет серьезно увеличить надежность и точность определения координат, прежде всего, в городских условиях.

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

В этом разделе нас, в первую очередь, будет интересовать возможность добавления в приложения способностей определять координаты устройства и работать с картами. При создании приложений, учитывающих текущее местоположение, под Android можно воспользоваться GPS и определением местоположения в сети (с помощью Network Location Provider). Несмотря на то, что GPS дает более точные результаты, он не очень хорошо работает в помещениях (чаще не работает), он сильно расходует заряд батареи и скорость определения координат не всегда соответствует ожиданиям пользователя. Network Location Provider определяет координаты, используя сигналы сотовых вышек и WiFi, может работать как на улице, так и внутри помещений, более экономно расходует заряд батареи и работает быстрее по сравнению с GPS. Для получения координат в приложении можно использовать оба способа или один из них на выбор.

Android предоставляет приложениям доступ к геолокационным возможностям мобильного устройства, через классы пакета android.location. Центральным классом этого пакета является класс LocationManager, который предоставляет доступ к системным сервисам для определения координат устройства.

В приложения можно добавлять карты, используя Google Maps Android API, которое автоматически управляет доступом к серверам Google Maps, загрузкой данных, отображением карт и сенсорными жестами на карте. Также можно использовать вызовы API для добавления маркеров, многоугольников и внешних прозрачных слоев, а также для изменения пользовательского представления отдельных участков карты.

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

Google Maps Android API не является частью платформы Android, но доступен на любом устройстве с Google Play Store, работающем, начиная с Android 2.2, через Google Play services. Чтобы обеспечить возможность интеграции Google Maps в приложения, в Android SDK необходимо установить библиотеку Google Play services.

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

9.7 Другие сенсоры и датчики

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

Платформа Android поддерживает три категории сенсоров:

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

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

Какие типы датчиков поддерживаются Android можно узнать по ссылке: http://developer.android.com/guide/topics/sensors/sensors_overview.html.

Android предоставляет набор классов и интерфейсов для работы с сенсорами. Эти классы и интерфейсы являются частью пакета android.hardware и позволяют выполнять следующие задачи:

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

Для работы с датчиками Android предоставляет следующие классы и интерфейсы:

SensorManager Этот класс может использоваться для создания экземпляра сервиса, связанного с сенсором. Также он предоставляет различные методы для доступа и составления списка сенсоров, подключения и отключения слушателей событий от сенсоров, сбора информации. Этот класс содержит константы, которые используются для задания точности сенсора, частоты получения данных и настройки датчиков.
Sensor Этот класс используется для создания экземпляра датчика, предоставляет методы, позволяющие определить свойства сенсора.
SensorEvent Система использует этот класс для создания объекта, соответствующего событию датчика и предоставляющего следующую информацию: данные сенсора; тип сенсора, который породил событие, точность данных и время появления события.
SensorEventListener Данный интерфейс может использоваться для реализации двух методов, получающих уведомления (события датчиков), когда меняется значение сенсора или когда меняется точность сенсора.

Использование в приложении полученных от сенсоров данных будет рассмотрено в лабораторной работе темы 7. Подробнее об использовании сенсоров можно узнать по ссылке: http://developer.android.com/guide/topics/sensors/sensors_overview.html.

Марат Нуриджанян
Марат Нуриджанян

Пример: Скачать среду можно с сайта для разработчиков Android (http://developer.android.com/sdk/index.html).

Там скачать можно только Android Studio

Владимир Каункин
Владимир Каункин

В самостоятельной работе 2 в примере решения задания некорректно загадывается число (в двух местах), выбирая случайное целое число из диапазона [0, 99] вместо [1, 100], как того требует условие. Кроме того, загадывание числа всё таки лучше вынести в отдельный метод, как мне кажется.