Разработка приложений, использующих датчики, для телефонов и планшетных ПК на базе процессоров Intel® Atom™ и под управлением ОС Android*

Разработка приложений, использующих датчики, для телефонов и планшетных ПК на базе процессоров 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), определяя тем самым, если пользователь говорит по телефону, и отключая экран на время разговора.

Таблица 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, используется в системе для определения освещенности окружающей среды и автоматической регулировки яркости экрана.

Таблица 7: Датчик освещенности
ДатчикТип SensorEvent
Данные (люкс)
Описание
 ALSTYPE_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, для вычисления высоты текущего местоположения устройства.

Таблица 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.

Таблица 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 предлагает разработчикам прикладные программные интерфейсы для обеспечения доступа к встроенным датчикам устройств. Эти датчики способны предоставлять исходные данные о текущем перемещении, положении устройства, а также о состоянии окружающей среды с высокой степенью точности и достоверности. При разработке приложений, использующих датчики, вы должны следовать признанным рекомендациям для повышения производительности и эффективности энергопотребления.

Об авторе

    Мао Вэй (Miao Wei) трудится инженером-программистом в подразделении программного обеспечения и услуг корпорации Intel. В настоящее время он работает в проектах по расширению сфер применения процессоров Intel® Atom™    .



 

 

 

© Корпорация Intel, 2013 г. Все права защищены.
*Другие наименования и товарные знаки являются собственностью своих законных владельцев.

**Этот пример исходного кода опубликован на условиях лицензионного соглашения о примерах исходного кода корпорации Intel

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