Перейти к содержанию
Fire Monkey от А до Я
  • 0

[Android] Как в вызываемом приложении получить результат, объект JIntent?


voytalexey

Вопрос

Есть два приложения, условно назовём главное и плагин. Главное создает объект JIntent после чего запускает плагин через вызов startActivity(Intent). Как мне в плагине получить доступ к этому передаваемому Intent? Использую Delphi XE6.

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Заголовок топика должен звучать так:

"Как в вызываемом приложении получить доступ к объекту JIntent?"

К сожалению, на этом форуме редактировать содержание поста можно, а вот его заголовок нет.

 

Теперь ответ на вопрос.

Доступ есть через SharedActivity.getIntent (надо подключить модули FMX.Helpers.Android и Androidapi.JNI.GraphicsContentViewText).

Для возврата информации в вызывающее приложение использовал

  SharedActivity.setResult(TJActivity.JavaClass.RESULT_OK, SharedActivity.getIntent);
  SharedActivity.finish();

Для того чтоб в главном приложении получить результат, надо перед вызовом подписаться на сообщение (в XE6):

  Intent := TJIntent.Create;
  Intent.setClassName(StringToJString('com.MySoft.PluginOne'),StringToJString('com.embarcadero.firemonkey.FMXNativeActivity'));
  // наполняем данные для передачи в плагин
  intent.putExtra(StringToJString('dbl'),123.456);
  intent.putExtra(StringToJString('str'),StringToJString('qwerty'));
  // подписываемся на сообщение, колл-бек метод "HandleActivityMessage"
  FMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification,HandleActivityMessage);
  // стартуем плагин
  SharedActivity.startActivityForResult(Intent,0);

Получение результата в вызывающем приложении делается в колл-бек методе, я делал так:

procedure TForm1.HandleActivityMessage(const Sender: TObject; const M: TMessage);
var
   RequestCode, ResultCode: Integer; 
   Intent: JIntent;
   d:double;
   s:string;
begin
  if not(M is TMessageResultNotification) then exit;
  TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, FMessageSubscriptionID);
  FMessageSubscriptionID := 0;

  RequestCode:=TMessageResultNotification(M).RequestCode;
  ResultCode:=TMessageResultNotification(M).ResultCode;
  Intent:=TMessageResultNotification(M).Value;

   if ResultCode = TJActivity.JavaClass.RESULT_OK then
   begin
    Memo1.Lines.Append('RESULT_OK');
    if Assigned(Intent) then
      begin
      d:=Intent.getDoubleExtra(StringToJString('dbl'),111.111);
      s:=JStringToString(Intent.getStringExtra(StringToJString('str')));
      Memo1.Lines.Append('d='+FloatToStr(d));
      Memo1.Lines.Append('s='+s);
      end;
    end
    else if ResultCode = TJActivity.JavaClass.RESULT_CANCELED then
    begin
      Memo1.Lines.Append('RESULT_CANCELED');
    end;
end;

Проверено в ХЕ6, идеи почерпнуты из следующих источников:

http://vlad8.com/tech/android-intents-tutorial/
http://www.darkraha.com/rus/mobile/android/api/intent.php
http://www.blong.com/Articles/DelphiXE6AndroidActivityResult/ActivityResult.htm

 в последней ссылке есть описание как решать эту проблему в ХЕ5, есть отличия.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...