【问题标题】:How to implement Google maps in Xamarin Forms (Android and iOS)? [closed]如何在 Xamarin Forms(Android 和 iOS)中实现 Google 地图? [关闭]
【发布时间】:2020-09-10 21:23:51
【问题描述】:

我有一个 Google 地图 API 密钥,我想用它在我的 Android 应用程序和使用 Xamarin 表单的 iOS 应用程序中显示地图。您会使用哪个库来减少两个操作系统上的冲突?

【问题讨论】:

    标签: google-maps xamarin xamarin.forms xamarin.android xamarin.ios


    【解决方案1】:

    一种简单的实现方法是使用 NuGet Xamarin.Forms.GoogleMaps

    Xamarin.Forms.GoogleMaps 功能:

    • 地图类型
    • 交通地图
    • 地图事件
    • 用动画平移
    • 直接平移
    • 别针
    • 自定义引脚
    • 引脚拖放
    • 多边形
    • 行
    • 圈子
    • 自定义地图图块

    按照以下步骤在您的项目中设置地图:

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

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

        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。

    如果您要使用地理定位,请添加一些使用功能。

    您的 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。在 FinishedLaunching 方法中初始化 AppDelegate.cs 中的库:
       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 中添加属性 NSLocationAlwaysUsageDescription NSLocationWhenInUseUsageDescription NSLocationAlwaysAndWhenInUseUsageDescription
        <? 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>
    

    完成


    现在您可以在 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>
    

    可选

    Request runtime location permissions

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

    1. 在 MainActivity 类中,添加以下字段:
        const int RequestLocationId = 0;
        
        readonly string[] LocationPermissions =
        {
            Manifest.Permission.AccessCoarseLocation,
            Manifest.Permission.AccessFineLocation
        };
    
    1. 在 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);
            }
        }
    

    【讨论】:

    • 您可以标记它,这将帮助更多有相同问题的人:)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    相关资源
    最近更新 更多