Here is the source code for my Open and View URL library from my CodeRage 8 session “Beyond the App”. Here is a download of the example app. I’ll see about posting it to a SVN repository too so it can grow and evolve. Thanks to Al Mannarino for his code that started this!
Note the code is using TidURL.URLEncode on all URLs. I found it is only required on the maps for iOS (iOS doesn’t like spaces) but may be causing trouble with the geo:// on Android.
Some example protocols
- http, tel, sms, fb, mailto, twitter, geo, etc.
Example URLs
- - Common to both iOS & Android -
- http://www.embarcadero.com/
- tel://(415)834-3131
- sms://1234
- http://twitter.com/coderage (This opens with the Twitter client on Android)
- mailto://jim.mckeeth@embarcadero.com
- twitter://user?screen_name=coderage
- fb://profile/34960937498 (get the UID from http://graph.facebook.com/embarcaderotech or for whatever page you are looking for)
- - iOS Specific -
- http://maps.apple.com?q=5617 Scotts Valley Drive, Scotts Valley, CA 95066 (this needs the URL encode – Apple has some additional APIs that are recommended.)
- - Android Only -
- content://contacts/people/
- content://contacts/people/1
- geo://0,0?q=5617 Scotts Valley Drive, Scotts Valley, CA 95066
- geo://46.191200, -122.194400 (I think this one doesn’t like the URLEncode)
unit OpenViewUrl; interface // URLEncode is performed on the URL // so you need to format it protocol://path function OpenURL(const URL: string; const DisplayError: Boolean = False): Boolean; implementation uses IdURI, SysUtils, Classes, FMX.Dialogs, {$IFDEF ANDROID} FMX.Helpers.Android, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.Net, Androidapi.JNI.JavaTypes; {$ELSE} {$IFDEF IOS} iOSapi.Foundation, FMX.Helpers.iOS; {$ENDIF IOS} {$ENDIF ANDROID} function OpenURL(const URL: string; const DisplayError: Boolean = False): Boolean; {$IFDEF ANDROID} var Intent: JIntent; begin // 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 SharedActivity.startActivity(Intent); exit(true); except on e: Exception do begin if DisplayError then ShowMessage('Error: ' + e.Message); exit(false); end; end; end; {$ELSE} {$IFDEF IOS} var NSU: NSUrl; begin // iOS doesn't like spaces, so URL encode is important. NSU := StrToNSUrl(TIdURI.URLEncode(URL)); if SharedApplication.canOpenURL(NSU) then exit(SharedApplication.openUrl(NSU)) else begin if DisplayError then ShowMessage('Error: Opening "' + URL + '" not supported.'); exit(false); end; end; {$ELSE} begin raise Exception.Create('Not supported!'); end; {$ENDIF IOS} {$ENDIF ANDROID} end.