Opening an URL at separated browser under Delphi XE5.

I was just recently handling quite simple task – to open an URL from the mobile application.

It’s simple under windows .. you will just call ShellExecute function.

But at Delphi that should unify access to all basic tasks for all different platforms is this function somehow missing… ops.

I found solution for the Android and solution for the iOS.

The result is this simple unit that is handling the problem:

unit Mobile.OpenURL;

(***
 *
 * Universal code to open URL at mobile for Delphi XE5.
 *
 * written by P.J.Strnad.
 *
 * Based on solutions from: http://stackoverflow.com/questions/16354876/opening-url-within-ios-application
 * and http://stackoverflow.com/questions/18873699/how-do-i-open-urls-pdfs-etc-with-the-default-apps
 *
 **)

interface

procedure openURL(url:String);

implementation

uses
{$IF defined(IOS)} //  and NOT defined(CPUARM)
 FMX.Helpers.iOS, iOSapi.Foundation;
{$ELSEIF defined(ANDROID)}
 Androidapi.JNI.GraphicsContentViewText,
 FMX.Helpers.Android;
{$ELSE}
 Winapi.Windows, Winapi.ShellAPI;
{$ENDIF}

{$IF defined(IOS)} //  and NOT defined(CPUARM)
procedure openURL(url:String);
begin
 SharedApplication.openURL(TNSURL.Wrap(TNSURL.OCClass.URLWithString(NSSTR(PChar(String(url))))));
end;

{$ELSEIF defined(ANDROID)}

procedure openURL(url:String);
var
  Intent: JIntent;
begin
 Intent := TJIntent.Create;
 Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
 Intent.setData(StrToJURI(url));
 SharedActivity.startActivity(Intent);
end;

{$ELSE}

procedure openURL(url:String);
begin
 shellExecute(0, 'open', PWideChar(url), nil, nil, SW_SHOW);
end;
{$ENDIF}

end.

It’s tested and works under iOS and Android.

Download

4 comments

  1. RC says:

    Prijde mi neuveritelny, ze v dnesni dobe jeste nekdo muze porat bejt zaseklej na Delphi 🙂 Jako bylo to fakt bezkonkurencni a super tech poslednich 15 let, ale dneska uz to proste je out…

    • pjstrnad says:

      Ty jo s tim co delaji na mobilech je to super. Mas jeden kod a fakt to bezi pod Windows, Macem, Androidem a iPhonem.

      A porad to mam radsi nez to sileny Cecko…

      • RC says:

        No, mas jeden kod, ale napsat ti ho da spoustu prace navic, IFDEF sem, IFDEF tam, a pak stejne vsude vypada nic moc, protoze nema vyhody opravdu nativnich aplikaci. Nemuzes pouzivat zadny 3rd-party knihovny, novy verze API mas pozde, atd.
        Prijde mi to podobny jako Qt aplikace (Bitcoin penezenka apod) – jsou debilni na Windows i na OS-X 🙂
        Muze to mozna davat smysl u her, nebo obecne u veci, ktery oteviraj jen OpenGL screen a jinak nic, ale na ty existujou lepsi systemy/enginy (Unity apod). Delat jeden multiplatformni kod pro vsechny mobilni a desktopovy OS, ktery pouzivaji nativni UI prvky, se podle mne nevyplati, protoze vetsina kodu je stejne UI-related (a pokud ne, da se jen udelat spolecna core knihovna).
        No ale hlavne ty managed jazyky (Java/.NET) a i jejich vyvojovy prostredi jsou proste uz dneska o dost lepsi nez Delphi. Vyjimka je mozna Objective C, ktery ma mimoradne dementni syntaxi, coz ale zase vyvazuje automatic reference countingem u objektu, takze nemusi mit garbage collector.
        Nemluvim jen teoreticky, nedavno jsem psal uplne stejnou aplikaci pro iOS i Android. Napred jsem tam mel spolecnou C++ knihovnu, ale i tu jsem nakonec vyhodil, protoze ty vyhody za to proste nestoji.
        Spolecnyho nebo i podobnyho kodu je tam nakonec minimum – na kazdy platforme se proste spousta veci dela uplne jinak.
        Chapu tvoji lenost resit na stary kolena “novy” jazyky – taky me to ze zacatku desne lezlo krkem. Ale dneska uz jsem strasne rad, ze jsem to pretrpel, protoze ted prepinam mezi VS, XCode a Android studiem aniz bych vubec vnimal ze tam je jina syntaxe (Jo a vlastne i Delphi, mam jeste jeden starej projekt kterej furt dodelavam)
        Cca od 4. jazyku dal uz se dalsi pridavaji podvedome a uplne bez odporu 🙂

        P.S. jakejkoliv jazyk kterej ma pointery uz nechci nikdy videt…

        • pjstrnad says:

          Cau,

          > Author : RC (IP: 94.112.184.72 , ip-94-112-184-72.net.upcbroadband.cz)
          > E-mail : rc@dejvice.cz
          > URL :
          > Whois : http://whois.arin.net/rest/ip/94.112.184.72
          > Comment:
          > No, mas jeden kod, ale napsat ti ho da spoustu prace navic, IFDEF sem, IFDEF tam, a pak stejne vsude vypada nic moc, protoze nema vyhody opravdu nativnich aplikaci. Nemuzes pouzivat zadny 3rd-party knihovny, novy verze API mas pozde, atd.
          no to prave naopak .. 3rd party knihovny nalinkujes uplne bez problemu. Delphi to delaji tak ze produkuji nativni kod primo pro kazdou platformu. Takze pro iPhone krasne linkuju knihovny pro ne a pro Android to same.

          Funguje to, mam to vyzkousene.

          > Prijde mi to podobny jako Qt aplikace (Bitcoin penezenka apod) – jsou debilni na Windows i na OS-X 🙂
          Ty taky nemam moc rad.

          > Muze to mozna davat smysl u her, nebo obecne u veci, ktery oteviraj jen OpenGL screen a jinak nic, ale na ty existujou lepsi systemy/enginy (Unity apod).
          Jo ale delals s Unity? Ja jo a je kolem toho strasne prace. Navic vsechny objekty musis generovat v LowRes pro mobily a linkovat rucne .. takze to ze Unity je opravdy multipltaformni je jen iluze.

          Delat jeden multiplatformni kod pro vsechny mobilni a desktopovy OS, ktery pouzivaji nativni UI prvky, se podle mne nevyplati, protoze vetsina kodu je stejne UI-related (a pokud ne, da se jen udelat spolecna core knihovna).
          To urcite ne. Spis to mam tak ze mam spolecnou komunikacni a logickou vrstvu a vizualy pak delam vzlast pro desktop a vzlast pro mobilni aplikace. Do mobilni aplikace nenarves vsechno co do desktopu a ovladani je uplne jiny takze je kravina to zkouset delat jako jednu app.

          > No ale hlavne ty managed jazyky (Java/.NET) a i jejich vyvojovy prostredi jsou proste uz dneska o dost lepsi nez Delphi. Vyjimka je mozna Objective C, ktery ma mimoradne dementni syntaxi, coz ale zase vyvazuje automatic reference countingem u objektu, takze nemusi mit garbage collector.
          Reference counting Delphi implementovali taky. Ale jinak souhlas.

          > Nemluvim jen teoreticky, nedavno jsem psal uplne stejnou aplikaci pro iOS i Android. Napred jsem tam mel spolecnou C++ knihovnu, ale i tu jsem nakonec vyhodil, protoze ty vyhody za to proste nestoji.
          Chapu… posli link.

          > Spolecnyho nebo i podobnyho kodu je tam nakonec minimum – na kazdy platforme se proste spousta veci dela uplne jinak.
          Tak u tech projektu co delam ja se to vyplati.

          > Chapu tvoji lenost resit na stary kolena “novy” jazyky – taky me to ze zacatku desne lezlo krkem. Ale dneska uz jsem strasne rad, ze jsem to pretrpel, protoze ted prepinam mezi VS, XCode a Android studiem aniz bych vubec vnimal ze tam je jina syntaxe (Jo a vlastne i Delphi, mam jeste jeden starej projekt kterej furt dodelavam)
          To ani ne. Ja prepinam mezi Javou, C#, PHP a Delphi.

          > Cca od 4. jazyku dal uz se dalsi pridavaji podvedome a uplne bez odporu 🙂

          > P.S. jakejkoliv jazyk kterej ma pointery uz nechci nikdy videt…
          Chapu .. tohle je na Delphi to nejhorsi ..

Leave a Reply

Your email address will not be published. Required fields are marked *