Исходный код, описанных здесь примеров можно найти на Github
Нередко возникают задачи, когда вашему приложению необходимо использовать функционал сторонней программы или наоборот, оно может выполнять некую обработку, необходимую другим приложениям. Примерами таких взаимодействий могут быть: использование стандартного медиа прогрывателя для воспроизведения видео или аудио, перевод текста, если в системе установленно приложение для этих целей, отправка смс сообщения и т.п. В этой заметке я постараюсь немного описать модель таких взаимодействий под платформой Tizen.
Рассмотрим 2 приложения TizenSender и TizenReceiver. Первое будет отправлять текст, а второе, соответственно, получать, обрабатывать и возвращать ответ Sender'у. Для обмена подобными сообщениями, приложение, которое посылает информацию, в нашем случае это TizenSender должно иметь привелегию http://tizen.org/privilege/application.launch в manifest.xml файле. В свою очередь, приложение, которое экспортирует возможности для других, должно содержать в своем манифесте AppControl с идентификатором операции, которую оно выполняет. Этот идентификатор имеет формат web uri сохраная при этом даже префикс http. Не понятно для чего было изменять стандарты принятые, например, в android, но разработчикам Tizen видней. В нашем случае мы зададим operationId, как http://example.org/tizen/communication.
В целом схема взаимодействия выглядит примерно так:
Начнем разработку примера с TizenSender'а, отталкиваясь от схемы выше. Для данных целей, нас интересуют 2 метода из класса AppManager из Tizen SDK это:
Пользовательский интерфейс будет простым, на 2 действия. Найти список приложений готовых обработать данный AppControl. Нужен чтобы убедиться, что TizenReceiver установлен и готов к работе. И второе, отправить введенное пользователем сообщение.
Нередко возникают задачи, когда вашему приложению необходимо использовать функционал сторонней программы или наоборот, оно может выполнять некую обработку, необходимую другим приложениям. Примерами таких взаимодействий могут быть: использование стандартного медиа прогрывателя для воспроизведения видео или аудио, перевод текста, если в системе установленно приложение для этих целей, отправка смс сообщения и т.п. В этой заметке я постараюсь немного описать модель таких взаимодействий под платформой Tizen.
Рассмотрим 2 приложения TizenSender и TizenReceiver. Первое будет отправлять текст, а второе, соответственно, получать, обрабатывать и возвращать ответ Sender'у. Для обмена подобными сообщениями, приложение, которое посылает информацию, в нашем случае это TizenSender должно иметь привелегию http://tizen.org/privilege/application.launch в manifest.xml файле. В свою очередь, приложение, которое экспортирует возможности для других, должно содержать в своем манифесте AppControl с идентификатором операции, которую оно выполняет. Этот идентификатор имеет формат web uri сохраная при этом даже префикс http. Не понятно для чего было изменять стандарты принятые, например, в android, но разработчикам Tizen видней. В нашем случае мы зададим operationId, как http://example.org/tizen/communication.
В целом схема взаимодействия выглядит примерно так:
Начнем разработку примера с TizenSender'а, отталкиваясь от схемы выше. Для данных целей, нас интересуют 2 метода из класса AppManager из Tizen SDK это:
static AppControl* FindAppControlN (const AppId &appId, const Tizen::Base::String &operationId) static Tizen::Base::Collection::IList* FindAppControlsN (const Tizen::Base::String *pOperationId, const Tizen::Base::String *pCategory, const Tizen::Base::String *pDataType, const Tizen::Base::String *pUriPattern)Или один из AppControl:
static result FindAndStart(const Tizen::Base::String &operationId, const Tizen::Base::String *pUriPattern, const Tizen::Base::String *pDataType, const Tizen::Base::String *pCategory, const Tizen::Base::Collection::IMap *pExtraData, IAppControlResponseListener *pListener)Первый метод принимает во входные параметры appId, и operationId. Т.к. appId уникальный, вы можете быть уверены что вам вернется AppControl нужного приложения. Второй метод пытается подобрать исполнителя только по operationId, и соответственно возвращает коллекцию всех возможных вариантов. Ну и последний метод, по сути своей, это совокупность метода номер 2 плюс метод Start. Он также попытается найти обработчик по operationId, но выбор подходящего приложения предоставит пользователю. Аргументы передаются через коллекцию ключ-значение extraData. Для стандартных контролов необходимые элементы коллекции предопределены. Для ваших собственных можно использовать любые произвольные, главное чтобы они были согласованы.
Пользовательский интерфейс будет простым, на 2 действия. Найти список приложений готовых обработать данный AppControl. Нужен чтобы убедиться, что TizenReceiver установлен и готов к работе. И второе, отправить введенное пользователем сообщение.
Далее переходим к TizenReceiver. Как уже указано выше, первое о чем стоит позаботиться, это добавить наш operationId к AppControl'ам в файле манифеста.
Теперь необходимо зарегистрировать объект реализующий интерфейc IAppControlProviderEventListener:
Возвращение результата, происходит аналогично, через коллекцию типа ключ-значение, с помощью метода OnAppControlRequestReceived класса OnAppControlRequestReceived. В итоге получаем:
Принцип работы прост. Запускаем TizenSender, пишем какой-либо текст в поле Message и жмем Send text. Должно открыться окно TizenReciver, в котором будет видно пришедший, и слегка измененный текст, который будет ответом. После нажатия Send response мы должны снова вернуться в окно TizenSender. Это все, остальные подробности нужно искать в документации.
void TizenReceiverApp::setAppControlListener(Tizen::App::IAppControlProviderEventListener* listener) { using namespace Tizen::App; AppControlProviderManager* mgr = AppControlProviderManager::GetInstance(); AppAssert(mgr); result r = mgr->SetAppControlProviderEventListener(listener); TryReturnVoid(!IsFailed(r), "Setting AppControlProviderEventListener failed. Error: %s", GetErrorMessage(r)); AppLog("AppControlProviderEventListener was registered successfully"); }Здесь есть небольшой нюанс. Метод SetAppControlProviderEventListener должен быть вызван до того, как сработает OnAppControlRequestReceived, точнее в App::OnAppInitializing. Иначе запрос будет просто проигнорирован. При этом нужно учесть, что после того как приложение будет инициализировано и UI контролы будут созданны указатель на коллекцию параметров extraData уже будет недействителен.
Возвращение результата, происходит аналогично, через коллекцию типа ключ-значение, с помощью метода OnAppControlRequestReceived класса OnAppControlRequestReceived. В итоге получаем:
Принцип работы прост. Запускаем TizenSender, пишем какой-либо текст в поле Message и жмем Send text. Должно открыться окно TizenReciver, в котором будет видно пришедший, и слегка измененный текст, который будет ответом. После нажатия Send response мы должны снова вернуться в окно TizenSender. Это все, остальные подробности нужно искать в документации.