Опубликован: 22.12.2015 | Уровень: для всех | Доступ: платный
Лекция 23:

Использование датчика GPS

< Лекция 22 || Лекция 23 || Лекция 24 >

Регистрация привилегии

Для создания навигационных или картографических приложений нам требуются географические координаты. Координаты важны также для таких приложений социальных сетей, как Facebook или Twitter. В этом разделе мы поговорим о том, как получать координаты с помощью сенсора GPS, используя Location Manager.

Создайте новое приложение 'SensorGpsSample.' Подключите привилегию http://tizen.org/privilege/location

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<manifest xmlns="http://tizen.org/ns/packages" api-version="2.3" package="org.example.sensorgps" version="1.0.0">
<profile name="mobile"/>
<ui-application appid="org.example.sensorgps" exec="sensorgps" multiple="false" nodisplay="false" taskmanage="true" type="capp">
<label>sensorgps</label>
<icon>sensorgps.png</icon>
</ui-application>
<privileges>
<privilege>http://tizen.org/privilege/location</privilege>
</privileges>
</manifest>

Проверка состояния Location Manager

Откройте файл исходного кода и внесите следующие изменения.

#include "sensorgpssample.h"
#include <locations.h>

typedef struct appdata {
Evas_Object *win;
Evas_Object *conform;

Evas_Object *label0;
Evas_Object *label1;
location_manager_h manager;
} appdata_s;

location.h — это файл заголовка библиотеки для Location Manager. Отобразим состояние менеджера локации в метке. Для этого добавим две функции выше create_base_gui().

static void
state_changed_cb(location_service_state_e state, void *user_data)
{
appdata_s *ad = user_data;
char buf[100];
char *enable = (state == LOCATIONS_SERVICE_ENABLED) ? "Enable" : "Disable";
sprintf(buf, "State is %s", enable);
elm_object_text_set(ad->label0, buf);
}
static void
show_state(appdata_s *ad)
{
location_manager_create(LOCATIONS_METHOD_GPS, &ad->manager);
location_manager_set_service_state_changed_cb(ad->manager, state_changed_cb, ad);
location_manager_start(ad->manager);
}
static void
my_box_pack(Evas_Object *box, Evas_Object *child,
double h_weight, double v_weight, double h_align, double v_align)
{
/* create a frame we shall use as padding around the child widget */
Evas_Object *frame = elm_frame_add(box);
/* use the medium padding style. there is "pad_small", "pad_medium",
* "pad_large" and "pad_huge" available as styles in addition to the
* "default" frame style */
elm_object_style_set(frame, "pad_medium");
/* set the input weight/aling on the frame insted of the child */
evas_object_size_hint_weight_set(frame, h_weight, v_weight);
evas_object_size_hint_align_set(frame, h_align, v_align);
{
/* tell the child that is packed into the frame to be able to expand */
evas_object_size_hint_weight_set(child, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
/* fill the expanded area (above) as opposaed to center in it */
evas_object_size_hint_align_set(child, EVAS_HINT_FILL, EVAS_HINT_FILL);
/* actually put the child in the frame and show it */
evas_object_show(child);
elm_object_content_set(frame, child);
}
/* put the frame into the box instead of the child directly */
elm_box_pack_end(box, frame);
/* show the frame */
evas_object_show(frame);
}

state_changed_cb() - это функция вызова, изменяющая состояние менеджера локации. Значения состояния передаются первому параметру. Типы состояния следующие:

  • LOCATIONS_SERVICE_DISABLED: служба недоступна.
  • LOCATIONS_SERVICE_ENABLED: служба доступна.

show_state() - это функция запрашивающая событие изменения состояния.

location_manager_create(location_method_e, location_manager_h*) - это API, который создает объект Location Manager object. Передача значения LOCATIONS_METHOD_GPS первому параметру заставляет второй параметры возвращать объект Location Manager. Типы информационной коллекции для локаций следующие:

  • LOCATIONS_METHOD_GPS : используется GPS.
  • LOCATIONS_METHOD_WPS : используется Wi-Fi.
  • LOCATIONS_METHOD_HYBRID : автоматический выбор между GPS и Wi-Fi.

location_manager_set_service_state_changed_cb(location_manager_h, location_service_state_changed_cb, void *) - это API, который определяет имя функции изменения состояния Location Manager.

Сделаем так, чтобы Location Manager запускался автоматически. Для этого добавим код в функцию create_base_gui().

/* Conformant */
ad->conform = elm_conformant_add(ad->win);
elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);
evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_win_resize_object_add(ad->win, ad->conform);
evas_object_show(ad->conform);

{ /* child object - indent to how relationship */
Evas_Object * box, *btn;
/* A box to put things in verticallly - default mode for box */
box = elm_box_add(ad->win);
evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_object_content_set(ad->conform, box);
evas_object_show(box);
{ /* child object - indent to how relationship */
/* Label-0 */
ad->label0 = elm_label_add(ad->conform);
elm_object_text_set(ad->label0, "Using of Locatin Manager");
my_box_pack(box, ad->label0, 1.0, 0.0, -1.0, 0.0);
}
}
/* Show window after base gui is set up */
evas_object_show(ad->win);
show_state(ad);
}

Запустим наш пример.


Запрос координат текущего местоположения

Реализуем код определения координат при нажатии на кнопку. Добавьте код в функцию create_base_gui().

{ /* child object - indent to how relationship */
/* Label-0 */
ad->label0 = elm_label_add(ad->conform);
elm_object_text_set(ad->label0, "Using of Location Manager");
my_box_pack(box, ad->label0, 1.0, 0.0, -1.0, 0.0);

/* Label-1 */
ad->label1 = elm_label_add(ad->conform);
elm_object_text_set(ad->label1, "Using of Locatiom Manager");
my_box_pack(box, ad->label1, 1.0, 0.0, -1.0, 0.0);

/* Button */
Evas_Object *btn = elm_button_add(ad->conform);
elm_object_text_set(btn, "Get Location");
evas_object_smart_callback_add(btn, "clicked", btn_clicked_cb, ad);
my_box_pack(box, btn, 1.0, 1.0, -1.0, 0.0);
}
}

Мы добавили метку и кнопку. Теперь потребуется обработчик нажатия на кнопку. Добавьте этот код выше функции create_base_gui().

static void
btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
{
appdata_s *ad = data;
double altitude, latitude, longitude, climb, direction, speed;
double horizontal, vertical;location_accuracy_level_e level;time_t timestamp;
location_manager_get_location(ad->manager, &altitude, &latitude, &longitude, &climb, &direction, &speed, &level, &horizontal, &vertical, &timestamp);
char buf[100];
sprintf(buf, "%0.5f/%0.5f", latitude, longitude);
elm_object_text_set(ad->label1, buf);
}

location_manager_get_location(location_manager_h, double *, double *, double *, double *, double *, double *, location_accuracy_level_e *, double *, double*, time_t*) - это API, который запрашивает информацию о местоположении. Эти параметры упорядочены следующим образом: объект менеджера локации, высота, широта, долгота, скорость вертикального перемещения, скорость перемещения по горизонтали, точность измерений по горизонтали (в метрах), точность измерений по вертикали (в метрах) и время.

Следующий код отображает координаты широты и долготы во второй метке.

Запустите проект. Для тестирования используйте панель управления эмулятора. Найдите пункт location и введите координаты (например, 54 градуса широты и 55 градусов долготы). Нажмите на кнопку Get Location. На экране телефона появятся координаты.

Запрос события перемещения

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

/* Show window after base gui is set up */
evas_object_show(ad->win);
show_state(ad);
location_manager_set_position_updated_cb(ad->manager, position_updated_cb, 2, ad);
}

location_manager_set_position_updated_cb(location_manager_h, location_position_updated_cb, int, void *) - это API, который запрашивает информацию об изменении местоположения. Его параметры следующие: объект менеджера локации, имя функции вызова события, временной интервал и пользовательские данные. В заключение, нам нужно создать функцию вызова. Добавьте код выше функции create_base_gui().

static void position_updated_cb(double latitude, double longitude, double altitude, time_t timestamp, void *user_data)
{
appdata_s *ad = user_data;
char buf[100];
sprintf(buf, "%0.5f/%0.5f - %ld", latitude, longitude, timestamp);
elm_object_text_set(ad->label1, buf);
}

position_updated_cb() - это функция вызова, срабатывающая при изменении местоположения. Ее параметры следующие: широта, долгота, высота, время и данные пользователя. Кооридинаты широты и долготы, равно как и время отображаются на экране внутри функции. Запустите пример.

< Лекция 22 || Лекция 23 || Лекция 24 >