在 Xamarin.Forms 中添加地图(Xamarin Studio)

你可以使用 Xamarin Forms 在每个平台上使用本机地图 API。你只需从 nuget 下载 Xamarin.Forms.Maps 包并将其安装到每个项目(包括 PCL 项目)。

地图初始化

首先,你必须将此代码添加到特定于平台的项目中。为此,你必须添加 Xamarin.FormsMaps.Init 方法调用,如下面的示例所示。

iOS 项目

文件 AppDelegate.cs

[Register("AppDelegate")]
public partial class AppDelegate : Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
{
    public override bool FinishedLaunching(UIApplication app, NSDictionary options)
    {
        Xamarin.Forms.Forms.Init();
        Xamarin.FormsMaps.Init();

        LoadApplication(new App());

        return base.FinishedLaunching(app, options);
    }
}

Android 项目

文件 MainActivity.cs

[Activity(Label = "MapExample.Droid", Icon = "@drawable/icon", Theme = "@style/MyTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    protected override void OnCreate(Bundle bundle)
    {
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;

        base.OnCreate(bundle);

        Xamarin.Forms.Forms.Init(this, bundle);
        Xamarin.FormsMaps.Init(this, bundle);

        LoadApplication(new App());
    }
}

平台配置

在显示地图之前,某些平台上需要其他配置步骤。

iOS 项目

在 iOS 项目中,你只需要在 Info.plist 文件中添加 2 个条目 :

  • NSLocationWhenInUseUsageDescription 字符串,值 We are using your location
  • NSLocationAlwaysUsageDescription 字符串,值 Can we use your location

StackOverflow 文档

Android 项目

要使用 Google 地图,你必须生成 API 密钥并将其添加到项目中。按照以下说明获取此密钥:

  1. (可选)查找 keytool 工具位置(默认为/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands

  2. (可选)打开终端并转到 keytool 位置:

    cd /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands

  3. 运行以下 keytool 命令:

    keytool -list -v -keystore "/Users/[USERNAME]/.local/share/Xamarin/Mono for Android/debug.keystore" -alias androiddebugkey -storepass android -keypass android

    显然,[USERNAME]是你当前的用户文件夹。你应该在输出中得到类似的东西:

    Alias name: androiddebugkey
    Creation date: Jun 30, 2016
    Entry type: PrivateKeyEntry
    Certificate chain length: 1
    Certificate[1]:
    Owner: CN=Android Debug, O=Android, C=US
    Issuer: CN=Android Debug, O=Android, C=US
    Serial number: 4b5ac934
    Valid from: Thu Jun 30 10:22:00 EEST 2016 until: Sat Jun 23 10:22:00 EEST 2046
    Certificate fingerprints:
             MD5:  4E:49:A7:14:99:D6:AB:9F:AA:C7:07:E2:6A:1A:1D:CA
             SHA1: 57:A1:E5:23:CE:49:2F:17:8D:8A:EA:87:65:44:C1:DD:1C:DA:51:95
             SHA256: 70:E1:F3:5B:95:69:36:4A:82:A9:62:F3:67:B6:73:A4:DD:92:95:51:44:E3:4C:3D:9E:ED:99:03:09:9F:90:3F
             Signature algorithm name: SHA256withRSA
             Version: 3
    
  4. 我们在此输出中需要的只是 SHA1 证书指纹。在我们的例子中,它等于:

    57:A1:E5:23:CE:49:2F:17:8D:8A:EA:87:65:44:C1:DD:1C:DA:51:95
    

    复制或保存此键的某处。我们稍后会需要它。

  5. 转到 Google Developers Console ,我们需要添加 Google Maps Android API ,因此请选择它: StackOverflow 文档

  6. Google 会要求你创建一个启用 API 的项目,请按照此提示创建项目: StackOverflow 文档 StackOverflow 文档

  7. 为你的项目启用 Google Maps API: StackOverflow 文档 启用 api 后,你必须为你的应用创建凭据。按照这个提示: StackOverflow 文档

  8. 在下一页上选择 Android 平台,点击“我需要哪些凭据?” 按钮,为你的 API 密钥创建一个名称,点击添加包名称和指纹,在步骤 4 中输入你的包裹名称和 SHA1 指纹,最后创建一个 API 密钥: StackOverflow 文档 要在 Xamarin Studio 中找到你的包裹名称,请转到你的 .Droid 解决方案 - > AndroidManifest.xml: StackOverflow 文档

  9. 创建后复制新的 API 密钥(不要忘记按下完成按钮)并将其粘贴到 AndroidManifest.xml 文件中: File AndroidManifest.xml StackOverflow 文档 **

    <?xml version="1.0" encoding="utf-8"?>
    <manifest
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:versionCode="1"
        android:versionName="1.0"
        package="documentation.mapexample">
        <uses-sdk
            android:minSdkVersion="15" />
        <application
            android:label="MapExample">
            <meta-data
                android:name="com.google.android.geo.API_KEY"
                android:value="AIzaSyBAg8X-t4pOIDDp3q5Ph45jKUIVjo_RnxU" />
            <meta-data
                android:name="com.google.android.gms.version"
                android:value="@integer/google_play_services_version" />
        </application>
    </manifest>        
    

    你还需要在清单中启用一些权限以启用一些其他功能:

    • 访问粗略位置
    • 访问好位置
    • 访问位置额外命令
    • 访问模拟位置
    • 访问网络状态
    • 访问 Wifi 状态
    • 互联网

    StackOverflow 文档 虽然,下载地图数据需要最后两个权限。阅读有关 Android 权限以了解更多信息。这是 Android 配置的所有步骤。

    注意 :如果你想在 Android 模拟器上运行你的应用程序,则必须在其上安装 Google Play 服务。按照本教程在 Xamarin Android Player 上安装 Play 服务。如果你在 Play 商店安装后找不到 Google Play 服务更新,你可以直接从你的应用更新它,你依赖于地图服务

添加地图

将地图视图添加到跨平台项目非常简单。这是一个如何做到这一点的例子(我正在使用没有 XAML 的 PCL 项目)。

PCL 项目

文件 MapExample.cs

public class App : Application
{
    public App()
    {
        var map = new Map();
        map.IsShowingUser = true;

        var rootPage = new ContentPage();
        rootPage.Content = map;

        MainPage = rootPage;
    }
}

就这样。现在,如果你在 iOS 或 Android 上运行你的应用程序,它会显示地图视图: http://i.stack.imgur.com/7tEiq.jpg