我有一个Google Map API密钥,我想使用它在Xamarin Forms的Android应用程序和iOS应用程序中显示地图。
您能显示出实现此目标的简单方法吗?
使用NuGet Xamarin.Forms.GoogleMaps的简单实现方法>
官方文档在设置步骤中不清楚。
Xamarin.Forms.GoogleMaps功能:
按照以下步骤在您的项目中设置地图:
在所有项目中安装NuGet包Xamarin.Forms.GoogleMaps。
Android
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());
}
在标签com.google.android.geo.API_KEY
内添加属性com.google.android.gms.version
org.apache.http.legacy
<application>
。
也添加所需的权限ACCESS_COARSE_LOCATION
ACCESS_FINE_LOCATION
。
如果要使用地理位置,请添加一些使用功能。
您的AndroidManifest.xml应该看起来像这样:
。使用FinishedLaunching方法初始化AppDelegate.cs中的库:<?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>
- iOS
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); }
- 在您的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>
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>
OPTIONAL
Request runtime location permissions
如果您的应用程序以API 23或更高版本为目标,并且需要访问用户的位置,则它必须在运行时检查它是否具有所需的权限,如果没有,则请求它。这可以通过以下方式完成:
const int RequestLocationId = 0;
readonly string[] LocationPermissions =
{
Manifest.Permission.AccessCoarseLocation,
Manifest.Permission.AccessFineLocation
};
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.
}
}
}
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);
}
}