如何在Xamarin Forms中实现Google地图(Android和iOS)?

3

我有一个Google地图API密钥,希望在我的Android应用程序和iOS应用程序中使用它来显示地图,并使用Xamarin Forms。您会使用哪个库以避免两个操作系统之间的冲突?

1个回答

9

使用NuGet Xamarin.Forms.GoogleMaps 是实现该功能的简单方法。

Xamarin.Forms.GoogleMaps 功能:

  • 地图类型
  • 交通地图
  • 地图事件
  • 带动画的平移
  • 直接平移
  • 标记
  • 自定义标记
  • 标记拖放
  • 多边形
  • 线条
  • 圆形
  • 自定义地图瓦片

按照以下步骤设置地图:

  1. 在所有项目中安装 NuGet 包 Xamarin.Forms.GoogleMaps。

  2. Android。 在 MainActivity.cs 中的 OnCreate 方法中初始化库:

    protected override void OnCreate(Bundle savedInstanceState)
    {
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;
    
        base.OnCreate(savedInstanceState);
    
        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
        Xamarin.FormsGoogleMaps.Init(this, savedInstanceState); //Initialize GoogleMaps here
        LoadApplication(new App());
    }
  1. 在你的AndroidManifest.xml文件中。

在标签<application>内添加属性com.google.android.geo.API_KEYcom.google.android.gms.versionorg.apache.http.legacy

同时添加必要的权限ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION

如果使用地理位置功能,还需添加一些uses-feature。

你的AndroidManifest.xml应该像这样:

    <?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="yvan.eht.nioj" android:installLocation="auto">
        <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
        <application android:label="YourApp.Android">
            <meta-data android:name="com.google.android.geo.API_KEY" android:value="Your_Api_Key_Here" />
            <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
            <uses-library android:name="org.apache.http.legacy" android:required="false" />
        </application>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-feature android:name="android.hardware.location" android:required="false" />
        <uses-feature android:name="android.hardware.location.gps" android:required="false" />
        <uses-feature android:name="android.hardware.location.network" android:required="false" />
    </manifest>
  1. iOS. 在你的AppDelegate.cs文件中的FinishedLaunching方法中初始化库:
   public override bool FinishedLaunching(UIApplication app, NSDictionary options)
   {
       global::Xamarin.Forms.Forms.Init();
       Xamarin.FormsGoogleMaps.Init("Your_Api_Key_Here");
       LoadApplication(new App());

       return base.FinishedLaunching(app, options);
   }
  1. 在您的 Info.plist 文件中添加以下属性:NSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescriptionNSLocationAlwaysAndWhenInUseUsageDescription
    <? xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
      <dict>
        <!--Your other Permissions may be on top -->
        <!-- Just add the Permissions below -->

        <key>NSLocationAlwaysUsageDescription</key>
        <string>Can we use your location at all times?</string>
        <key>NSLocationWhenInUseUsageDescription</key>
        <string>Can we use your location when your application is being used?</string>
        <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
        <string>Can we use your location at all times?</string>
      </dict>
    </plist>

DONE


现在你可以在XAML中添加地图并像以下这样在Android和iOS应用程序中显示它:

    <?xml version="1.0" encoding="utf-8"?>
    <ContentPage
        xmlns="http://xamarin.com/schemas/2014/forms"
        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
        xmlns:d="http://xamarin.com/schemas/2014/forms/design"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:maps="clr-namespace:Xamarin.Forms.GoogleMaps;assembly=Xamarin.Forms.GoogleMaps"
        mc:Ignorable="d"
        x:Class="YourApp.MainPage">
        <ContentPage.Content>
            <Grid HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
                <Grid.RowDefinitions>
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
    
                <maps:Map x:Name="map" VerticalOptions="FillAndExpand"></maps:Map>
            </Grid>
        </ContentPage.Content>
    </ContentPage>

可选

请求运行时位置权限

如果您的应用程序针对API 23或更高版本并且需要访问用户的位置,则必须在运行时检查它是否具有所需的权限,并在没有该权限时请求它。可以按以下方式完成:

  1. 在MainActivity类中添加以下字段:
    const int RequestLocationId = 0;
    
    readonly string[] LocationPermissions =
    {
        Manifest.Permission.AccessCoarseLocation,
        Manifest.Permission.AccessFineLocation
    };

在MainActivity类中,添加以下OnStart重写方法:
    protected override void OnStart()
    {
        base.OnStart();
    
        if ((int)Build.VERSION.SdkInt >= 23)
        {
            if (CheckSelfPermission(Manifest.Permission.AccessFineLocation) != Permission.Granted)
            {
                RequestPermissions(LocationPermissions, RequestLocationId);
            }
            else
            {
                // Permissions already granted - display a message.
            }
        }
    }
  1. (如果您正在使用Xamarin Essentials,则无需执行此步骤)在MainActivity类中添加以下OnRequestPermissionsResult重写:
    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults)
    {
        if (requestCode == RequestLocationId)
        {
            if ((grantResults.Length == 1) && (grantResults[0] == (int)Permission.Granted))
                // Permissions granted - display a message.
            else
                // Permissions denied - display a message.
        }
        else
        {
            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

你可以标记一下,这将有助于更多遇到相同问题的人 :)。 - nevermore

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