• 0
x11

Открытие ссылки в проекте Firemonkey

Вопросы

Нет ли у FMX готовой функции для открытия веб-ссылок из приложения?

А то приходится городить огород с лисапетами и кучей IFDEF.

В итоге что у меня получилось.

Для удобства разнес все по разным модулям.

Модуль для Windiws

unit uUtilsWindows;

interface

{$IFDEF MSWINDOWS}
uses ShellApi, Variants, Windows, FMX.Types, FMX.Platform.Win;

  procedure WindowsOpenUrl(const sUrl: string; WindowHandle: TWindowHandle);
{$ENDIF}

implementation

{$IFDEF MSWINDOWS}
procedure WindowsOpenUrl(const sUrl: string; WindowHandle: TWindowHandle);
begin
  ShellExecute(FmxHandleToHWND(WindowHandle), 'open', PChar(VarToStr(sURL)), nil, nil, SW_NORMAL);
end;
{$ENDIF}


end.

 

Модуль для Android

unit uUtilsAndroid;

interface

{$IFDEF ANDROID}
uses FMX.Helpers.Android, Androidapi.JNI.Net, Androidapi.JNI.GraphicsContentViewText,
      AndroidApi.Helpers;

  procedure AndroidOpenUrl(const sUrl: string);
{$ENDIF}

implementation

{$IFDEF ANDROID}
procedure AndroidOpenUrl(const sUrl: string);
Var
  Uri: Jnet_Uri;
  OpenLinkIntent: JIntent;
begin

  Uri := StrToJURI(sUrl);
  OpenLinkIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, Uri);// будем что-то смотреть
  OpenLinkIntent.addCategory(TJIntent.JavaClass.CATEGORY_BROWSABLE);// смотреть в браузере
  OpenLinkIntent.setData(Uri);// смотреть эту ссылку
  SharedActivity.startActivity(OpenLinkIntent);// открываем
end;
{$ENDIF}

end.

 

теперь в основной форме:

uses ..., ...{$IFDEF ANDROID}, vkbdhelper, uUtilsAndroid{$ENDIF} {$IFDEF MSWINDOWS}, uUtilsWindows {$ENDIF};
...
...
...
procedure TfmEditObject.actOpenUrlExecute(Sender: TObject);
begin
  {$IFDEF ANDROID}AndroidOpenUrl(edMapsCoordUrl.Text);{$ENDIF}
  {$IFDEF MSWINDOWS}WindowsOpenUrl(edMapsCoordUrl.Text, Self.Handle);{$ENDIF}
end;

 

А если добавлять ещё одну платформу, то ещё один модуль понадобится.

Может есть более правильный вариант, так сказать, дизайна исходного кода?

 

Изменено пользователем x11

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 ответа на этот вопрос

  • 0

ОК. Просто я думал, что я неправильно делаю.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Вот какая проблема.

Команда ShellExecute на Windows 10 открывает не только браузер и сайт, но и потом сразу же диалоговое окно выбора файла.

Странно.

Воспроизводится так.

На Multiview лежит Layout, на Layout лежит ImageControl с картинкой. У ImageControl в OnClick прописана строка вызова процедуры со ссылкой.

Изменено пользователем x11

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 19.08.2017 в 18:34, x11 сказал:

А то приходится городить огород с лисапетами и кучей IFDEF.

Вы не там ифдефы пишете. Не нужно здесь много модулей.
Для примера. (емнип - автор @Равиль Зарипов (ZuBy) ). Единая точка входа в функцию и отличаются только внутренности.

function OpenURL(const URL: string; const DisplayError: Boolean = False): Boolean;
var
  {$IFDEF ANDROID}
  Intent: JIntent;
  {$ENDIF}
  {$IFDEF IOS}
  NSU: NSUrl;
  {$ENDIF}
  {$IFDEF MSWINDOWS}
  Res: HINST;
  {$ENDIF}
begin
  {$IFDEF ANDROID}
  // There may be an issue with the geo: prefix and URLEncode.
  // will need to research
  Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW,
    TJnet_Uri.JavaClass.parse(StringToJString(TIdURI.URLEncode(URL))));
  try
    TAndroidHelper.Activity.startActivity(Intent);
    exit(true);
  except
    on e: Exception do
      begin
        if DisplayError then
          TDialog.ShowMessage('Error: ' + e.Message);
        exit(False);
      end;
  end;
  {$ENDIF}
  {$IFDEF IOS}
  // iOS doesn't like spaces, so URL encode is important.
  NSU := StrToNSUrl(URL);
  if SharedApplication.canOpenURL(NSU) then
    exit(SharedApplication.OpenURL(NSU))
  else
    begin
      if DisplayError then
        TDialog.ShowMessage('Error: Opening "' + URL + '" not supported.');
      exit(False);
    end;
  {$ENDIF}
  {$IFDEF MSWINDOWS}
  Res := ShellExecute(0, 'open', PChar(URL), nil, nil, SW_SHOW);
  Result := Res > 32;
  {$ENDIF}
end;

И теперь "снаружи" этой функции вам без разницы, под какую платформу идет сборка. В любом случае вы пишете "OpenURL('http://blablabla.net');". Безо всяких IFDEF.

Изменено пользователем kami

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От fredhack
      Доброго времени суток подскажите пожалуйста как мне получить ссылку из браузера запущенного через intent в общем суть такова:
      1 запускаю браузер через интент с сылкой http://fire-monkey.ru
      2 на ссылке происходит редирект
      3 я попадаю на http://fire-monkey.ru/forum/
      Как получить последнюю ссылку после редиректа? в данном случае она равна http://fire-monkey.ru/forum/
      var Intent: JIntent; begin Intent := TJIntent.Create; Intent.setAction(TJIntent.JavaClass.ACTION_VIEW); Intent.setData(StrToJURI('http://fire-monkey.ru')); SharedActivity.startActivity(Intent); end;  
    • От Edward Tarasov
      поставил этот патч 
      https://cc.embarcadero.com/item/30805
      Версия PAserver на mac стала - 10.1.1.37, test connection отвечает success, но при компиляции выдаеться ошибка - [PAClient Error] Error: E0014 Connection refused. Platform Assistant Server version mismatch - expecting version '10.0.1.23'. 
      10.0.1.23 - это старая версия PA... откатиться нельзя ибо не пашет, тоесть этот патч исправляет старую проблему - но добавляет эту... суть в том, как я понял после 4-х часовго гугления, что надо исправить PAclient, у которого версия почему то осталась старая... кто знает как с этим быть?
    • От Edward Tarasov
      Чего то под конец написания диплома, вылазиет все больше и больше ошибок... еще одна!
      Удалил не нужный layout - теперь пишет -'asentor for bron not found' , и так со всем чтобы не удалил - причем под винду компилиться норм, а с ведройдом беда! кто то сталкивался?
    • От Edward Tarasov
      Подскажите плз студенту, весь инет перерыл - ничего кроме tmapview не нашел, и тот позволяет только отображать маркеры и прокладывать через них маршрут... ок маршрут проложили а как включить навигацию? чтобы телка сказала - поверни те туда то.... не ясно, и возможно ли вообще такое? 
      Кстатить при использовании tmapview вместо карты - пустой экран.
      вообщем надо передать в tmapview мое местоположение и куда надо идти, затем включить навигацию
      Кто занет как сделать ?????????
      Или может есть возможность использовать встроенные возможности навигации?
    • От Антон Емельянов
      Приложение не даёт DeviceToken...  ,  (DeviceID есть)
      FDeviceToken := FPushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken];

      Тест пример реализован по статье нашего замечательного модератора
      http://blog.rzaripov.kz/2017/02/firebase-android-ios-2.html

      Используется:
      Компиляция SDK Android 5.1
      Среда-разработки Delphi XE 10.2 

      Пожалуйста запустите проект на своей версии Delphi..
      Посмотрите будет  сгенерирован ТОКЕН или нет.. 
      в случае удачи ,  напишите какая у вас версия Дельфи..

      Исходник-проекта:  https://drive.google.com/open?id=1mCPvYYd0tXBALt-J_ymVuzChj_TtztC0
      Только APK: https://drive.google.com/open?id=1x8q4RyVylpGOMjcQYjlvFxFBSQaYs7NL 


      Помогите люди добрые 
      За помощь и консультацию отблагодарю..
       

    • От AliZairov
      Привет. Я сделал новую версию YouTubeApi компоненты. Поддерживаемые VCL & FMX + Mobile.
      Никаких официальных YouTube Api компоненты. Только данные с парсинг. Пример доступен в архиве.
       
      Новый
      ===
      v1.4 - 25/02/2018
        + Устранение проблем
      YouTubeApiDelphi
    • От Edward Tarasov
      Такая проблема... прога на андройд - два лэйаута в первом просто кнопки, во втором браузер. до тех пор пока второй лэйаут с браузером не открыли - кнопки в первом нажимаются - как только открыли браузер и закрыли его(visible:=false(и лэйаут и браузер)) кнопки в первом всеравно не нажимаются, как будто нажимаю на пустой лайаут, при том что сами кнопки на форме видно.
    • От sargon
      Добрый день, у меня есть один вопрос, делаю приложение в виде программы-мастера на FMX, в качестве страничек мастера использую TTabControl, случайно обнаружил, что при нажатии Tab+Ctrl вкладки переключаются, вроде так и должно быть, но мне вот такое поведение не подходит. Можно ли как-то отключить\заблокировать переключение вкладок по нажатию клавиш. Пробовал обрабатывать события KeyUp и KeyDown для TTabItem, но переключение вкладки происходит раньше, чем происходит вызов обработчика. Оно не критично конечно, но может быть кто-то сталкивался (если коротко, хочу переключать вкладки только по нажатию кнопок в программе)? Спасибо.
    • От gresaggr
      Добрый день.
      Как под FMX в ListView сделать подчеркивание Detail в рантайме?
      Пытался делать так:
      LV.ItemAppearanceObjects.ItemObjects.Detail.Font.Style := [TFontStyle.fsUnderline]
      но не срабатывает.
      P.S. Возможно это применить не ко всем строкам, а только к некоторым?
  • Последние посетители   0 пользователей онлайн

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