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

Вызов внешнего приложения с помощью AppControl

< Лекция 5 || Лекция 6 || Лекция 7 >

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

При разработке приложений вам могут понадобится новые возможности, такие, как просмотр изображений или камера. Реализация всех необходимых функций с помощью трудоемкого кодирования может быть довольно утомительной, хотя есть более легкий способ достижения своих целей.

Объект AppControl ссылается на все приложения, инсталлированные на платформе Tizen. Вы можете загружать AppControl, если знаете имя сборки.

Создайте новый проект 'AppControlSample'. Добавьте следующие привилегии:

Конфигурационный файл:

<manifest xmlns="http://tizen.org/ns/packages" api-version="2.3" package="org.example.appcontrolex" version="1.0.0">
<profile name="mobile"/>
<ui-application appid="org.example.appcontrolex" exec="appcontrolex" multiple="false" nodisplay="false" taskmanage="true" type="capp">
<label>appcontrolex</label>
<icon>appcontrolex.png</icon>
</ui-application>
<privileges>
<privilege>http://tizen.org/privilege/internet</privilege>
<privilege>http://tizen.org/privilege/appmanager.launch</privilege>
<privilege>http://tizen.org/privilege/email</privilege>
</privileges>
</manifest>

Загрузка примера

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

#include "appcontrolsample.h"

#include <app.h>
#include <app_control.h>
#define FM_PHONE_FOLDER "/opt/usr/media"

typedef struct appdata {
Evas_Object *win;
Evas_Object *conform;
Evas_Object *label;
} appdata_s;

app.h и app_control.h -это файлы заголовков библиотек для использования AppControl.

"/opt/usr/media" - это корневой каталог для общих папок.

Давайте загрузим пример HelloWorld. Добавьте код создания контейнера Box и кнопки в функции 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 */
/* A box to put things in verticallly - default mode for box */
Evas_Object *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*/
ad->label = elm_label_add(ad->win);
elm_object_text_set(ad->label, "<align=center>Using of App Control</>");
evas_object_size_hint_weight_set(ad->label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
my_box_pack(box, ad->label, 1.0, 0.0, -1.0, 0.5);

/* Button-1 */
Evas_Object *btn = elm_button_add(ad->conform);
elm_object_text_set(btn, "Sample App");
evas_object_smart_callback_add(btn, "clicked", btn_sample_app_cb, ad);
/* epand both horiz and vert, fill horiz and vert */
my_box_pack(box, btn, 1.0, 1.0, -1.0, -1.0);
}
}

/* Show window after base gui is set up */
evas_object_show(ad->win);
}

Создайте две функции выше create_base_gui().

static void
btn_sample_app_cb(void *data, Evas_Object *obj, void *event_info)
{
appdata_s *ad = data;
app_control_h app_control;
app_control_create(&app_control);
app_control_set_operation(app_control, APP_CONTROL_OPERATION_DEFAULT);
app_control_set_app_id (app_control, "org.example.helloworld");
if (app_control_send_launch_request(app_control, NULL, NULL) == APP_CONTROL_ERROR_NONE)
dlog_print(DLOG_INFO, "tag", "Succeeded to launch a Helloworld app.");
else
dlog_print(DLOG_INFO, "tag", "Failed to launch a calculator app.");
app_control_destroy(app_control);
}

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);
}

Btn_sample_app_cb() - это обработчик нажатия кнопки.

app_control_h — это структура AppControl.

app_control_create(app_control_h *) - это API, создающий объект AppControl.

app_control_set_operation(app_control_h, char *) - это API, определяющий роль AppControl. При загрузке внешнего приложения просто используйте значение APP_CONTROL_OPERATION_DEFAULT.

app_control_set_app_id(app_control_h, char *) - это API, который определяет имя сборки, еоторая должна быть загружена в AppControl. Имя сборки примера HelloWorld - "org.example.helloworld."

app_control_send_launch_request(app_control_h, app_control_reply_cb, void *) - это API, который запускает AppControl.

app_control_destroy(app_control_h) - это API, который удаляет объект AppControl.

my_box_pack() - это функция, которая добавляет элемент управления к контейнеру Box.

Перед запуском приложения убедитесь, что пример HelloWorld инсталлирован в эмулятор. Если этого сделано не было, создайте проект 'HellowWorld' и инсталлируйте его в эмулятор.

После этого запустите проект AppControlSample и нажмите на кнопку. Запустится пример HelloWorld.


Передача данных другим приложениям

Теперь мы попробуем передать данные в пример HelloWorld.

Добавьте код в функцию btn_sample_app_cb() файла appcontrolsample.c .

static void
btn_sample_app_cb(void *data, Evas_Object *obj, void *event_info)
{
appdata_s *ad = data;
app_control_h app_control;
app_control_create(&app_control);
app_control_set_operation(app_control, APP_CONTROL_OPERATION_DEFAULT);

app_control_add_extra_data(app_control, "pet", "dog");
app_control_add_extra_data(app_control, "dessert", "juice");

app_control_set_app_id (app_control, "org.example.helloworld");
if (app_control_send_launch_request(app_control, NULL, NULL) == APP_CONTROL_ERROR_NONE)
dlog_print(DLOG_INFO, "tag", "Succeeded to launch a Helloworld app.");
else
dlog_print(DLOG_INFO, "tag", "Failed to launch a calculator app.");
app_control_destroy(app_control);
}

app_control_add_extra_data(app_control_h, char *, char *) - это API, который добавляет данные объекту AppControl. Его параметры следующие: объект AppControl object, ключевые значения и текстовые данные. Мы создали передающую часть. Теперь можно заняться приемной частью. Откройте файл (/src/helloworld.c) примера HelloWorld и добавьте в начало файла глобальную переменную.

typedef struct appdata {
Evas_Object *win;
Evas_Object *conform;
Evas_Object *label;
} appdata_s;

char recv_data[100];

Функция событий вызывается столько раз, сколько добавляются данные в AppControl. Для хранения всех данных объявляются глобальные переменные. Перейдите в нижнюю часть исходного кода. Там вы увидите функцию app_control(). Эта функция — обработчик события AppControl. Добавьте новый код и функции.

bool _app_control_extra_data_cb(app_control_h app_control, const char *key, void *data)
{
int ret;
char *value;
ret = app_control_get_extra_data(app_control, key, &value);
strcat(recv_data, key);
strcat(recv_data, ":");
strcat(recv_data, value);
strcat(recv_data, " / ");
appdata_s *ad = data;
elm_object_text_set(ad->label, recv_data);
return true;
}

static void
app_control(app_control_h app_control, void *data)
{
app_control_foreach_extra_data(app_control, _app_control_extra_data_cb, data);
}

_app_control_extra_data_cb() - это функция вызова, которая принимает отдельные данные. Если мы передадим данные в приложение AppControlSample, эта функция будет вызвана дважды.

app_control_get_extra_data(app_control_h, char *, char **) - это API, который выделяет данные из объекта AppControl. Передача ключа в качестве второго параметра заставляет третий параметр возвращать данные.

app_control() - это функция вызова, которая запускается, когда объект AppControl получает значения.

app_control_foreach_extra_data(app_control_h, app_control_extra_data_cb, void *) - это API, который определяет функцию обработки для индивидуальных данных, сохраненных в объекте AppControl.

Запустите пример и нажмите на кнопку. Убедитесь в том, что данные были переданы приложению HelloWorld.


< Лекция 5 || Лекция 6 || Лекция 7 >