Разработка приложений, использующих датчики, для телефонов и планшетных ПК на базе процессоров Intel® Atom™ и под управлением ОС Android*
Это руководство предназначено для разработчиков приложений и в нем содержится обзор инфраструктуры датчиков, поддерживаемых ОС Android, а также обсуждается использование некоторых датчиков, которые, как правило, присутствуют в телефонах и планшетных ПК на базе процессоров Intel® Atom™. Здесь обсуждаются датчики движения, положения и окружающей среды. Хотя компоненты GPS не считаются датчиками в инфраструктуре Android, сервис определения местоположения на основе GPS также обсуждается в этом руководстве. Все присутствующие в данном руководстве темы относятся к ОС Android 4.2 Jelly Bean.
Датчики на телефонах и планшетных ПК на базе процессоров Intel® Atom™
В телефонах и планшетных ПК на базе процессоров Intel Atom под управлением ОС Android могут использоваться различные аппаратные датчики. Все они применяются для обнаружения движений, местоположения и сбора данных, характеризующих окружающую среду. На рисунке 1 представлена схема возможной конфигурации датчиков на обычном устройстве на базе процессора Intel Atom под управлением ОС Android.
Рисунок 1. Датчики в системе Android на базе процессора Intel® Atom™
С учетом сообщаемых данных датчики Android могут разделяться на классы и типы, представленные в таблице 1.
Датчики движения | Акселерометр (TYPE_ACCELEROMETER) | Измеряет ускорение устройства в м/с2 | Обнаружение движения |
Гироскоп (TYPE_GYROSCOPE) | Измеряет скорости вращения устройства | Обнаружение вращения | |
Датчики определения положения | Магнитометр (TYPE_MAGNETIC_FIELD) | Измеряет силу геомагнитного поля Земли в мкТл | Компас |
Приближение (TYPE_PROXIMITY) | Измеряет близость объекта в см. | Обнаружение ближайшего объекта | |
GPS (не тип android.hardware.Sensor) | Получает данные о точном географическом местоположении устройства | Обнаружение точного географического местоположения | |
Датчики окружающей среды | ALS (TYPE_LIGHT) | Измеряет уровень освещенности в люксах | Автоматическое управление яркостью экрана |
Барометр | Измеряет давление окружающего воздуха в миллибарах | Определение высоты |
Таблица 1. Типы датчиков, поддерживаемые платформой Android
Инфраструктура датчиков Android
Инфраструктура датчиков Android предлагает механизмы доступа к датчикам и их данным, за исключением GPS, доступ к которому осуществляется с помощью сервисов определения местоположения ОС Android. Они также будут обсуждаться в этой статье. Инфраструктура датчиков является частью пакета android.hardware. В таблице 2 перечислены классы и интерфейсы инфраструктуры датчиков.
Имя | Тип | Описание |
---|---|---|
SensorManager | Класс | Используется для создания экземпляра сервиса датчика. Предоставляет различные методы доступа к датчикам, возможности регистрации и отмены регистрации приемников событий датчиков и т.д. |
Датчик | Класс | Используется для создания экземпляра конкретного датчика. |
SensorEvent | Класс | Используются системой для публикации данных датчика. Сюда относятся исходные значения данных датчика, тип датчика, точность данных и штамп времени. |
SensorEventListener | Интерфейс | Предоставляет методы вызова для получения оповещений от класса SensorManager после изменения данных или точности показаний датчика. |
Таблица 2. Инфраструктура датчиков на платформе Android
Получение конфигурации датчиков
Производители устройств индивидуально принимают решения о том, какие датчики будут доступны на устройстве. Вы должны выяснить, какие датчики доступны во время выполнения, вызывая для этого метод getSensorList() инфраструктуры датчиков SensorManager с параметром “Sensor.TYPE_ALL”. В примере кода 1 представлен список доступных датчиков, поставщик, энергопотребление и информация о точности каждого датчика.
package com.intel.deviceinfo; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Fragment; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorManager; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.SimpleAdapter; public class SensorInfoFragment extends Fragment { private View mContentView; private ListView mSensorInfoList; SimpleAdapter mSensorInfoListAdapter; private List<sensor> mSensorList; private SensorManager mSensorManager; @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } @Override public void onPause() { super.onPause(); } @Override public void onResume() { super.onResume(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mContentView = inflater.inflate(R.layout.content_sensorinfo_main, null); mContentView.setDrawingCacheEnabled(false); mSensorManager = (SensorManager)getActivity().getSystemService(Context.SENSOR_SERVICE); mSensorInfoList = (ListView)mContentView.findViewById(R.id.listSensorInfo); mSensorInfoList.setOnItemClickListener( new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View view, int index, long arg3) { // with the index, figure out what sensor was pressed Sensor sensor = mSensorList.get(index); // pass the sensor to the dialog. SensorDialog dialog = new SensorDialog(getActivity(), sensor); dialog.setContentView(R.layout.sensor_display); dialog.setTitle("Sensor Data"); dialog.show(); } }); return mContentView; } void updateContent(int category, int position) { mSensorInfoListAdapter = new SimpleAdapter(getActivity(), getData() , android.R.layout.simple_list_item_2, new String[] { "NAME", "VALUE" }, new int[] { android.R.id.text1, android.R.id.text2 }); mSensorInfoList.setAdapter(mSensorInfoListAdapter); } protected void addItem(List<Map<String, String>> data, String name, String value) { Map<String, String> temp = new HashMap<String, String>(); temp.put("NAME", name); temp.put("VALUE", value); data.add(temp); } private List<? extends Map<String, ?>> getData() { List<Map<String, String>> myData = new ArrayList<Map<String, String>>(); mSensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL); for (Sensor sensor : mSensorList ) { addItem(myData, sensor.getName(), "Vendor: " + sensor.getVendor() + ", min. delay: " + sensor.getMinDelay() +", power while in use: " + sensor.getPower() + "mA, maximum range: " + sensor.getMaximumRange() + ", resolution: " + sensor.getResolution()); } return myData; } }
Пример кода 1. Фрагмент, который представляет список датчиков**
Система координат датчика
Инфраструктура датчиков представляет данные датчика, используя стандартную 3-осевую систему координат, где X, Y и Z соответственно представлены значениями values[0], values[1] и values[2] в объекте SensorEvent.
Некоторые датчики, такие как датчики света, температуры, приближения и давления, возвращают только одиночные значения. Для этих датчиков используются только значения объекта SensorEvent – values[0].
Другие датчики представляют данные в стандартной 3-осевой системе координат. Далее приведен список таких датчиков:
- Акселерометр
- Датчик гравитации
- Гироскоп
- Датчик геомагнитного поля
3-осевая система координат датчика выбирается относительно экрана устройства в его обычной (по умолчанию) ориентации. Для телефона ориентация по умолчанию – портретная; для планшетного ПК – альбомная. Когда устройство удерживается в своем обычном положении, ось х направлена по горизонтали и указывает вправо, ось у направлена вертикально вверх, а ось z указывает за пределы экрана (навстречу смотрящему). На рисунке 2 показана система координат датчика для телефона, а на рисунке 3 – для планшетного ПК
Рисунок 2. Система координат датчика для телефона
Рисунок 3. Система координат датчика для планшетного ПК
Наиболее важным моментом для системы координат датчика является тот факт, что эта система никогда не меняется, когда устройство перемещается или меняется его ориентация.
Мониторинг событий датчиков
Инфраструктура датчиков представляет данные датчика вместе с объектами SensorEvent. Класс может управлять данными конкретного датчика с помощью интерфейса SensorEventListener и регистрации SensorManager для данного датчика. Инфраструктура датчиков информирует класс об изменениях состояния значений датчика с помощью двух следующих методов вызова SensorEventListener, используемых классом:
onAccuracyChanged()
и
onSensorChanged()
В примере кода 2 представлен SensorDialog, используемый в примере SensorInfoFragment, который обсуждался в разделе "Получение конфигурации датчиков".
package com.intel.deviceinfo; import android.app.Dialog; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.widget.TextView; public class SensorDialog extends Dialog implements SensorEventListener { Sensor mSensor; TextView mDataTxt; private SensorManager mSensorManager; public SensorDialog(Context ctx, Sensor sensor) { this(ctx); mSensor = sensor; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mDataTxt = (TextView) findViewById(R.id.sensorDataTxt); mDataTxt.setText("..."); setTitle(mSensor.getName()); } @Override protected void onStart() { super.onStart(); mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_FASTEST); } @Override protected void onStop() { super.onStop(); mSensorManager.unregisterListener(this, mSensor); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() != mSensor.getType()) { return; } StringBuilder dataStrBuilder = new StringBuilder(); if ((event.sensor.getType() == Sensor.TYPE_LIGHT)|| (event.sensor.getType() == Sensor.TYPE_TEMPERATURE)|| (event.sensor.getType() == Sensor.TYPE_PRESSURE)) { dataStrBuilder.append(String.format("Data: %.3fn", event.values[0])); } else{ dataStrBuilder.append( String.format("Data: %.3f, %.3f, %.3fn", event.values[0], event.values[1], event.values[2] )); } mDataTxt.setText(dataStrBuilder.toString()); } }
Пример кода 2.Диалог, в котором представлены значения датчика**
Датчики движения
Датчики движения используются для мониторинга движений устройства, таких как тряска, поворот, качание или наклон. Акселерометр и гироскоп представляют собой два датчика движения, которые доступны на многих планшетных ПК и телефонах.
Датчики движения представляют данные, используя систему координат, где три значения в объекте SensorEvent это значения values[0], values[1] b values[2], представляющие данные по соответствующим им осям координат x, y и z.
Чтобы получить представление о датчиках движения и использовать их данные в приложении, необходимо применять некоторые физические формулы, связанные с силой, массой, ускорением на основании законов Ньютона, и отношениями между некоторыми из этих данных во времени. Чтобы получить информацию об этих физических формулах, обратитесь к вашим любимым учебникам по физике или популярным сайтам в Интернете.
Акселерометр
Акселерометр измеряет ускорение, которое прилагается к устройству. Его свойства приведены в таблице 3.
Датчик | Тип | SensorEvent Данные (м/с2) | Описание |
---|---|---|---|
Акселерометр | TYPE_ACCELEROMETER | values[0] values[1] values[2] | Ускорение по оси x Ускорение по оси y Ускорение по оси z |
Таблица 3. Акселерометр
Концепция акселерометра основана на действии второго закона Ньютона:
a = F/m
Ускорением объекта является результат приложения к нему внешней силы. В число внешних сил входит и сила тяжести, которая прилагается ко всем объектам на Земле. Она пропорциональна силе F, приложенной к объекту и обратно пропорциональна массе m объекта.
В нашем коде вместо прямого использования приведенного выше уравнения мы рассматриваем результат ускорения в течение периода времени относительно его скорости и местоположения. Следующее уравнение описывает связь скорости объекта v1 с его первоначальной скоростью v0, ускорением aи временем t:
v1 = v0 + at
Для определения смещения объекта sмы используем следующее уравнение:
s = v0t + (1/2)at2
Во многих случаях мы начинаем с условием v0, равным 0 (перед тем, как устройство начинает двигаться), что упрощает уравнение до:
s = at2/2
Из-за действующей силы тяжести ускорение свободного падения, представленное символом g, применяется ко всем объектам на Земле. Не завися от массы объекта, gзависит только от широты местоположения объекта со значением в диапазоне от 9,78 до 9,82 (м/с2). Мы принимаем традиционное стандартное значение, используемое для g:
g = 9.80665 (m/s2)
Поскольку акселерометр представляет значения с использованием многомерной системы координат устройства, в нашем коде мы можем рассчитать расстояние по осям x, y и z, используя следующие уравнения:
Sx = AxT2/2
Sy=AyT2/2
Sz=AzT2/2
Где Sx, Syи Szявляются смещениями по осям х, у и z соответственно, а Ax, Ayи Azявляются ускорениями по осям х, у и z, соответственно. T– это время периода измерения
public class SensorDialog extends Dialog implements SensorEventListener { … private Sensor mSensor; private SensorManager mSensorManager; public SensorDialog(Context context) { super(context); mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); … }
Пример кода 3. Использование акселерометра**
Иногда мы не используем все три значения данных. В других случаях, возможно, потребуется принять во внимание ориентацию устройства. Например, для приложения Лабиринт мы используем только данные силы тяжести для оси х и оси y при вычислении направлений и расстояний движения шара на основании данных ориентации устройства. Следующий фрагмент кода (пример кода 4) представляет логику.
@Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER) { return; } float accelX, accelY; … //detect the current rotation currentRotation from its “natural orientation” //using the WindowManager switch (currentRotation) { case Surface.ROTATION_0: accelX = event.values[0]; accelY = event.values[1]; break; case Surface.ROTATION_90: accelX = -event.values[0]; accelY = event.values[1]; break; case Surface.ROTATION_180: accelX = -event.values[0]; accelY = -event.values[1]; break; case Surface.ROTATION_270: accelX = event.values[0]; accelY = -event.values[1]; break; } //calculate the ball’s moving distances along x, and y using accelX, accelY and the time delta … } }
Пример кода 4.Определение ориентации устройства с использованием данных акселерометра в игре Лабиринт**
Гироскоп
Гироскоп измеряет скорость вращения устройства вокруг осей x, y и z, как это показано в таблице 4. Значения данных гироскопа могут быть положительными или отрицательными. Исторически принято, что вращение вокруг оси против часовой стрелки считается положительным, а вращение вокруг оси по часовой стрелке – отрицательным. Мы также можем определить направление значения гироскопа, используя "правило правой руки", показанное на рисунке 4.
Рисунок 4. Использование правила "правой руки"для определения положительного направления вращения
Датчик | Тип | SensorEvent Данные (рад/с) | Описание |
---|---|---|---|
Гироскоп | TYPE_GYROSCOPE | values[0] values[1] values[2] | Скорость вращения вокруг оси x Скорость вращения вокруг оси y Скорость вращения вокруг оси z |
Таблица 4. Гироскоп
В примере кода 5 показано, как конструировать образец гироскопа.
public class SensorDialog extends Dialog implements SensorEventListener { … private Sensor mGyro; private SensorManager mSensorManager; public SensorDialog(Context context) { super(context); mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); mGyro = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE); … }
Пример кода 5. Использование гироскопа**
Датчики положения
Многие планшетные ПК Android имеют два датчика положения: магнитометр и датчик приближения. Магнитометр измеряет силу магнитного поля Земли по осям х, у и z, а датчик приближения определяет расстояние от устройства до другого объекта.
Магнитометр
Наиболее важным назначением магнитометра (представлено в таблице 5) в системах Android является реализация функций компаса.
Датчик | Тип | SensorEvent Данные (мкТл) | Описание |
---|---|---|---|
Магнитометр | TYPE_MAGNETIC_FIELD | values[0] values[1] values[2] | Сила магнитного поля Земли по оси x Сила магнитного поля Земли по оси y Сила магнитного поля Земли по оси z |
Таблица 5. Магнитометр
В примере кода 6 показано, как конструировать образец магнитометра.
public class SensorDialog extends Dialog implements SensorEventListener { … private Sensor mMagnetometer; private SensorManager mSensorManager; public SensorDialog(Context context) { super(context); mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); … }
Пример кода 6.Использование магнитометра**
Приближение
Датчик приближения измеряет расстояние между устройством и другим объектом. Устройство может использовать его для обнаружения того, насколько близко оно находится к пользователю (см. таблицу 6), определяя тем самым, если пользователь говорит по телефону, и отключая экран на время разговора.
Датчик | Тип | SensorEvent Данные | Описание |
---|---|---|---|
Приближение | TYPE_PROXIMITY | values[0] | Расстояние до объекта в см. Некоторые датчики приближения могут лишь сообщать логическое значение для указания, что объект находится достаточно близко. |
В примере кода 7 показано использование датчика приближения.
public class SensorDialog extends Dialog implements SensorEventListener { … private Sensor mProximity; private SensorManager mSensorManager; public SensorDialog(Context context) { super(context); mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); … }
Пример кода 7.Использование датчика приближения**
Датчики окружающей среды
Датчики окружающей среды используются для обнаружения и представления характеристик окружающей устройства среды, таких как свет, температура, давление или влажность. Датчик освещенности (ALS) и датчик давления (барометр) доступны на многих планшетных ПК с ОС Android.
Датчик освещенности (ALS)
Датчик освещенности, представленный в таблице 7, используется в системе для определения освещенности окружающей среды и автоматической регулировки яркости экрана.
Датчик | Тип | SensorEvent Данные (люкс) | Описание |
---|---|---|---|
ALS | TYPE_LIGHT | values[0] | Освещение вокруг устройства |
В примере кода 8 показано использование датчика освещенности.
… private Sensor mALS; private SensorManager mSensorManager; … mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); mALS = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); …
Пример кода 8.Использование датчика освещенности**
Барометр
Приложения могут использовать датчик атмосферного давления (барометр), представленный в таблице 8, для вычисления высоты текущего местоположения устройства.
Датчик | Тип | SensorEvent Данные (люкс) | Описание |
---|---|---|---|
Барометр | TYPE_PRESSURE | values[0] | Давление окружающего воздуха в миллибарах. |
В примере кода 9 показано использование барометра
… private Sensor mBarometer; private SensorManager mSensorManager; … mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); mBarometer = mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE); …
Пример кода 9. Использование барометра**
Принципы настройки производительности и оптимизации датчиков
Чтобы использовать датчики в приложениях, вы должны выполнять следующие рекомендации:
- Проверяйте доступность конкретного датчика перед его использованием
Платформа Android не требует включения или исключения определенного датчика на устройстве. Перед использованием датчика в вашем приложении нужно сначала проверить его действительную доступность. - Всегда отменяйте регистрацию приемников датчиков
Если операция, использующая приемник датчика, станет невидимой или диалог будет остановлен, нужно отменить регистрацию приемника датчика. Это может быть сделано с помощью метода операции OnPause() или в методе диалога OnStop(). Иначе датчик будет продолжать сбор данных и, в результате, разряжать батарею. - Не блокируйте метод onSensorChanged()
Метод onSensorChanged() часто вызывается системой для представления данных датчика. Для этого метода требуется совсем немного логики. Сложные вычисления с данными датчиков должны быть вынесены за пределы этого метода. - Всегда тестируйте свои приложения, работающие с датчиками, на реальных устройствах
Все датчики, описанные в этом разделе, являются аппаратными датчиками. Эмулятор ОС Android может быть не в состоянии имитировать конкретные функции и определить производительность датчика.
GPS и местоположение
GPS (Global Positioning System) является системой, основанной на получении спутниковых данных, которая выдает точную информацию о географическом положении по всему миру. Коммуникации GPS доступны на многих телефонах и планшетных ПК с ОС Android. Во многих случаях устройство GPS работает также как датчик положения. Оно может предоставлять точные данные о местоположении для работающих на устройстве приложений. На платформе Android устройство GPS не управляется непосредственно инфраструктурой датчиков. Вместо этого сервис определения местоположения Android взаимодействует и передает данные GPS в приложения через вызовы приемника местоположения.
В этом разделе рассматриваются только сервисы GPS и определение местоположения, как если бы это был аппаратный датчик. Обычно объем стратегий определения местоположения, используемые в ОС Android 4.2 в аппаратных платформах телефонов и планшетных ПК на базе процессоров Intel Atom, значительно больше, и данная тема и выходит за рамки настоящей статьи.
Сервисы определения местоположения Android
Использование GPS не является единственным способом получения информации о местоположении устройства Android. Система также может использовать Wi-Fi*, сотовые или другие беспроводные сети, чтобы получить данные о текущем местоположении устройства. GPS и беспроводные сети (включая Wi-Fi и сотовые сети) выступают в качестве "поставщиков данных определения местоположения"для сервисов Android. В таблице 9 перечислены основные классы и интерфейсы, используемые для доступа к сервисам определения местоположения в ОС Android.
Имя | Тип | Описание |
---|---|---|
LocationManager | Класс | Используется для доступа к сервисам определения местоположения. Предоставляет различные методы для запроса периодических обновлений данных местоположения для приложения или для отправки предупреждений о приближении |
LocationProvider | Абстрактный класс | Абстрактный супер-класс для поставщиков определения местоположения |
Местоположение | Класс | Используется поставщиками данных местоположения для инкапсуляции географических данных |
LocationListener | Интерфейс | Используется для получения оповещений о местоположении из LocationManager |
Получение обновлений данных GPS о местоположении
По аналогии с механизмом использования инфраструктуры датчиков для получения данных датчиков, приложение использует несколько методов вызовов, определенных в интерфейсе LocationListener для сбора обновлений данных GPS о местоположении. LocationManager отправляет в приложение оповещения об обновлениях данных GPS с помощью этих вызовов (правило – "Не звоните нам, мы сами обратимся к вам").
Для получения данных GPS о местоположении в приложении нужно запросить разрешение на получение точной информации о местоположении в вашем файле манифеста Android (пример кода 10).
<manifest …> … <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> … </manifest>
Пример кода 10.Запрос разрешения на получение точной информации о местоположении в файле манифеста**
В примере кода 11 представлено, как получать обновления данных GPS и отображать координаты широты и долготы в текстовом диалоге.
package com.intel.deviceinfo; import android.app.Dialog; import android.content.Context; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.widget.TextView; public class GpsDialog extends Dialog implements LocationListener { TextView mDataTxt; private LocationManager mLocationManager; public GpsDialog(Context context) { super(context); mLocationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mDataTxt = (TextView) findViewById(R.id.sensorDataTxt); mDataTxt.setText("..."); setTitle("Gps Data"); } @Override protected void onStart() { super.onStart(); mLocationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, this); } @Override protected void onStop() { super.onStop(); mLocationManager.removeUpdates(this); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } @Override public void onLocationChanged(Location location) { StringBuilder dataStrBuilder = new StringBuilder(); dataStrBuilder.append(String.format("Latitude: %.3f, Logitude%.3fn", location.getLatitude(), location.getLongitude())); mDataTxt.setText(dataStrBuilder.toString()); } }
Пример кода 11. Диалог, отображающий данные GPS о местоположении**
Принципы настройки и оптимизации производительности сервисов GPS и определения местоположения
Сервис GPS предлагает наиболее точную информацию о местоположении устройства. С другой стороны, являясь аппаратным компонентом, он потребляет дополнительную энергию. Также требуется время, чтобы сервис GPS мог получить первые данные о местоположении. Далее приведено несколько рекомендаций, которые вы должны учитывать при разработке приложений с сервисами GPS и определения местоположения:
- Используйте всех доступных поставщиков данных о местоположении
В дополнение к сервису GPS_PROVIDER есть сервис NETWORK_PROVIDER. Если приложению нужно получить лишь грубые данные о местоположении, вы можете использовать только сервис NETWORK_PROVIDER. - Используйте кэшированные местоположения
Требуется время, чтобы сервис GPS мог получить первые данные о местоположении. Когда ваше приложение ожидает данные от сервиса GPS, чтобы получить их точное обновление, для выполнения части работы вы можете сначала использовать местоположения, предоставляемые методом getlastKnownLocation() в классе LocationManager. - Минимизируйте количество и продолжительность запросов для обновления данных о местоположении
Вы должны запрашивать обновления данных о местоположении только в случае необходимости и оперативно отменять регистрацию менеджера местоположений, как только данные сервисы более не будут нужны.
Заключение
Платформа Android предлагает разработчикам прикладные программные интерфейсы для обеспечения доступа к встроенным датчикам устройств. Эти датчики способны предоставлять исходные данные о текущем перемещении, положении устройства, а также о состоянии окружающей среды с высокой степенью точности и достоверности. При разработке приложений, использующих датчики, вы должны следовать признанным рекомендациям для повышения производительности и эффективности энергопотребления.
Об авторе
© Корпорация Intel, 2013 г. Все права защищены.
*Другие наименования и товарные знаки являются собственностью своих законных владельцев.
**Этот пример исходного кода опубликован на условиях лицензионного соглашения о примерах исходного кода корпорации Intel