Разработка нативных приложений Tizen

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

Показывать лекцию целиком

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

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

Создайте новое приложение '

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

    Вернуться к учебному плану