我知道我可以Programmatically open Maps app in iOS 6使用maps.apple.com/?q=Firehouse+Subs
这样的网址,但是如何才能使用FireMonkey?我可以将它放入WebBrowser,但它只显示Google Maps的Web界面。另外我知道这对于Android不起作用,但是我可以使用意图来处理它,但FireMonkey似乎也没有公开它。
更新:进一步的研究表明,即使我写了一些特定于平台的代码,这暂时也是不可能的。 This answer表示如果不涉及Java,就无法触发意图。是否仍然可以通过C ++将URL发送到iOS以打开导航?我对iOS开发没有太多经验。
答案 0 :(得分:1)
事实证明,URL是两个操作系统的答案。通过一些辅助函数向操作系统发送URL,我能够实现打开导航。我在这里的博客上找到了这个源代码。它是用Delphi编写的,但事实证明你可以将Delphi文件添加到你的项目中,在你的C ++中编译#include“filename.hpp”并使用你在Delphi中创建的函数。
unit OpenViewUrl;
interface
uses System.Sensors;
// URLEncode is performed on the URL
// so you need to format it protocol://path
function OpenURL(const URL: string; const DisplayError: Boolean = False): Boolean;
function OpenNavigation(const Q: string): Boolean; overload;
function OpenNavigation(const Q: string; const Coord: TLocationCoord2D): Boolean; overload;
implementation
uses
IdURI, SysUtils, Classes, FMX.Dialogs
{$IFDEF ANDROID}
, FMX.Helpers.Android, Androidapi.JNI.GraphicsContentViewText,
Androidapi.JNI.Net, Androidapi.JNI.JavaTypes, Androidapi.Helpers;
{$ELSE}
{$IFDEF IOS}
, iOSapi.Foundation, FMX.Helpers.iOS, Macapi.Helpers;
{$ELSE};
{$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))));
TJnet_Uri.JavaClass.parse(StringToJString(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));
NSU := StrToNSUrl(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}
function OpenNavigation(const Q: string): Boolean;
var Coord: TLocationCoord2D;
begin
Coord.Latitude := 0.0;
Coord.Longitude := 0.0;
OpenNavigation(Q, Coord);
end;
function OpenNavigation(const Q: string; const Coord: TLocationCoord2D): Boolean;
var
CoordString: String;
begin
//Open in Google Maps
{$IFDEF ANDROID}
exit(OpenURL('http://maps.google.com/?q=' + Q));
{$ELSE}
//In iOS, if Google Maps is installed, use it, otherwise, use Apple Maps
//If we have coordinates, use them as the start address
{$IFDEF IOS}
//Get a string of the longitute and latitute seperated by a comma if set
if (Coord.Latitude <> 0.0) or (Coord.Longitude <> 0.0) then
begin
CoordString := Coord.Latitude.ToString + ',' + Coord.Longitude.ToString;
end
else begin
CoordString := '';
end;
if not OpenURL('comgooglemaps://?daddr=' + Q) then
begin
if (0.0 < CoordString.Length) then
begin
exit(OpenURL('http://maps.apple.com/?daddr=' + Q + '&saddr=loc:' + CoordString));
end
else begin
exit(OpenURL('http://maps.apple.com/?daddr=' + Q));
end;
end
else begin
exit(true);
end;
{$ELSE}
//Unsupported platform
exit(false);
{$ENDIF IOS}
{$ENDIF ANDROID}
end;
end.
最后一个功能是我添加的功能。它将根据操作系统打开地图应用程序,并可选择使用一组坐标来导航,如果使用Apple地图,因为它不像谷歌地图那样处理它。如果有人能够,我无法在iOS上测试谷歌地图,请告诉我。
答案 1 :(得分:0)
#include <fmx.h>
#include <System.IOUtils.hpp>
#include <Androidapi.JNI.GraphicsContentViewText.hpp>
#include <Androidapi.JNI.Net.hpp>
#include <Androidapi.Helpers.hpp>
#include <FMX.Helpers.Android.hpp>
void __fastcall TForm4::Button1Click(TObject *Sender)
{
String url = "geo:0,0?q=Manchester";
_di_JIntent Intent = TJIntent::JavaClass->init(TJIntent::JavaClass->ACTION_VIEW,TJnet_Uri::JavaClass->parse(StringToJString(url)));
SharedActivity()->startActivity(Intent);
}
我希望上面的代码可以帮到你。它确实适用于我的应用程序。只记得把你要导航的地方而不是曼彻斯特..它可以是一个邮政编码或地方,或者如果你想要你可以在地理位置之后传递纬度和态度而不是0,0