如何在Xamarin.Forms中本地启动外部应用程序?

3
如问题标题所示,我正在寻找一种在Xamarin.Forms应用程序内启动外部应用程序的方法。例如,我的应用程序有一个地址列表,当用户点击其中之一时,会打开当前平台的内置地图应用程序(Android上的Google Maps,iOS上的Apple Maps)。如果有影响的话,我只针对Android和iOS进行开发。
当然,我可以使用依赖服务并按平台编写启动应用程序的代码,但我更希望只需编写一次即可。在Xamarin.Forms中是否有本地方法来实现此功能呢?我在Xamarin网站或论坛上找不到任何正式记录此功能的文档。
3个回答

10

使用Device.OpenUri,并传入适当的 URI,再结合Device.OnPlatform来根据平台格式化 URI。

string url; 

Device.OnPlatform(iOS: () =>
  {
     url = String.Format("http://maps.apple.com/maps?q={0}", address);
  },
  Android: () =>
  {
    url = String.Format("http://maps.google.com/maps?q={0}", address);
  });

Device.OpenUri(url);

1
自Xamarin.Forms v4.3.0.908675(可能是v4.3.0)起,Device.OpenUri已被弃用,您应该改用来自Xamarin.Essentials的Launcher.TryOpenAsync。虽然您可能会觉得这很麻烦,至少我是这样认为的。

1
使用下面的代码,并添加命名空间Xamarin.EssentialsXamarin.Forms
if (Device.RuntimePlatform == Device.iOS)
{
    // https://developer.apple.com/library/ios/featuredarticles/iPhoneURLScheme_Reference/MapLinks/MapLinks.html
    await Launcher.OpenAsync("http://maps.apple.com/?daddr=San+Francisco,+CA&saddr=cupertino");
}
else if (Device.RuntimePlatform == Device.Android)
{
    // opens the 'task chooser' so the user can pick Maps, Chrome or other mapping app
    await Launcher.OpenAsync("http://maps.google.com/?daddr=San+Francisco,+CA&saddr=Mountain+View");
}
else if (Device.RuntimePlatform == Device.UWP)
{
    await Launcher.OpenAsync("bingmaps:?rtp=adr.394 Pacific Ave San Francisco CA~adr.One Microsoft Way Redmond WA 98052");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接