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