打开地图应用

Browse sample. 浏览示例

本文介绍如何使用 .NET Multi-platform App UI (.NET MAUI) IMap 接口。 此接口使应用程序能够将已安装的地图应用程序打开到特定位置或地标。

IMap 接口的默认实现通过 Map.Default 属性提供。 IMap 接口和 Map 类都包含在 Microsoft.Maui.ApplicationModel 命名空间中。

开始使用

要访问浏览器功能,需要下列特定平台的设置。

Android 使用 geo: URI 方案在设备上启动地图应用程序。 这可能会提示用户从支持此 URI 方案的现有应用中进行选择。 Google Maps 支持此方案。

Platforms/Android/AndroidManifest.xml 文件中,将以下 queries/intent 节点添加到 manifest 节点:

<queries>
  <intent>
    <action android:name="android.intent.action.VIEW" />
    <data android:scheme="geo"/>
  </intent>
</queries>

使用地图

地图功能的工作原理是调用 IMap.OpenAsync 方法,并传递类型为 LocationPlacemark 的实例。 以下示例在特定 GPS 位置打开已安装的地图应用:

public async Task NavigateToBuilding25()
{
    var location = new Location(47.645160, -122.1306032);
    var options = new MapLaunchOptions { Name = "Microsoft Building 25" };

    try
    {
        await Map.Default.OpenAsync(location, options);
    }
    catch (Exception ex)
    {
        // No map application available to open
    }
}

提示

LocationPlacemark 类型位于 Microsoft.Maui.Devices.Sensors 命名空间中。

使用 Placemark 打开地图时,需要提供更多信息。 此信息有助于地图应用搜索要查找的位置。 需要提供以下信息:

public async Task NavigateToBuilding()
{
    var placemark = new Placemark
    {
        CountryName = "United States",
        AdminArea = "WA",
        Thoroughfare = "Microsoft Building 25",
        Locality = "Redmond"
    };
    var options = new MapLaunchOptions { Name = "Microsoft Building 25" };

    try
    {
        await Map.Default.OpenAsync(placemark, options);
    }
    catch (Exception ex)
    {
        // No map application available to open or placemark can not be located
    }
}

测试地图是否已打开

打开地图应用始终有可能失败,例如没有地图应用或应用没有正确的权限。 对于每个 IMap.OpenAsync 方法重载,都有一个相应的 IMap.TryOpenAsync 方法,该方法返回一个布尔值,指示地图应用已成功打开。 以下代码示例使用 TryOpenAsync 方法打开地图:

var location = new Location(47.645160, -122.1306032);
var options = new MapLaunchOptions { Name = "Microsoft Building 25" };

if (await Map.Default.TryOpenAsync(location, options) == false)
{
    // Map failed to open
}

扩展方法

只要导入 Microsoft.Maui.Devices.Sensors 命名空间(新的 .NET MAUI 项目会自动执行此操作),就可以使用内置扩展方法 OpenMapsAsync 打开地图:

public async Task NavigateToBuildingByPlacemark()
{
    var placemark = new Placemark
    {
        CountryName = "United States",
        AdminArea = "WA",
        Thoroughfare = "Microsoft Building 25",
        Locality = "Redmond"
    };

    var options = new MapLaunchOptions { Name = "Microsoft Building 25" };

    try
    {
        await placemark.OpenMapsAsync(options);
    }
    catch (Exception ex)
    {
        // No map application available to open or placemark can not be located
    }
}

添加导航

打开地图后,可以计算从设备的当前位置到指定位置的路线。 将 MapLaunchOptions 类型传递给 Map.OpenAsync 方法,并指定导航模式。 以下示例打开地图应用并指定驾驶导航模式:

public async Task DriveToBuilding25()
{
    var location = new Location(47.645160, -122.1306032);
    var options = new MapLaunchOptions { Name = "Microsoft Building 25",
                                         NavigationMode = NavigationMode.Driving };

    try
    {
        await Map.Default.OpenAsync(location, options);
    }
    catch (Exception ex)
    {
        // No map application available to open
    }
}

平台差异

本部分介绍地图 API 特定于平台的差异。

NavigationMode 支持骑行、驾车和步行。