google-maps - 如何在 Xamarin Forms(Android 和 iOS)中实现 Google 地图?
问题描述
我有一个 Google 地图 API 密钥,我想用它在我的 Android 应用程序和使用 Xamarin 表单的 iOS 应用程序中显示地图。您将使用哪个库来减少两个操作系统上的冲突?
解决方案
一种简单的实现方法是使用 NuGet Xamarin.Forms.GoogleMaps
Xamarin.Forms.GoogleMaps 功能:
- 地图类型
- 交通图
- 地图事件
- 用动画平移
- 直接平移
- 引脚
- 自定义引脚
- 引脚拖放
- 多边形
- 线条
- 界
- 自定义地图图块
按照以下步骤在您的项目中设置地图:
在所有项目中安装 NuGet 包 Xamarin.Forms.GoogleMaps。
安卓。在 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());
}
- 在您的 AndroidManifest.xml中。
com.google.android.geo.API_KEY
com.google.android.gms.version
org.apache.http.legacy
在标签内添加属性<application>
。
还添加了所需的权限ACCESS_COARSE_LOCATION
ACCESS_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>
- 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);
}
- 在您的 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>
可选的
如果您的应用程序以 API 23 或更高版本为目标并且需要访问用户的位置,它必须在运行时检查它是否具有所需的权限,如果没有则请求它。这可以通过以下方式完成:
- 在 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.
}
}
}
- (如果您使用 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);
}
}
推荐阅读
- google-apps-script - 无法将 Apps 脚本项目切换到新的云平台项目?
- inno-setup - Inno Setup ParseVersion 不可从 [代码] 调用
- python - 在 Python 的 Playwright 中,我如何获取与 ElementHandle 相关的元素(孩子、父母、祖父母、兄弟姐妹)?
- macos - 使用 XCode 12.3 编译的应用程序无法在 M1 芯片机器上启动
- flutter - 在颤动标签栏布局中尝试在每个标签中的图标下方显示图标和文本时,底部溢出 4 个像素
- vue.js - 如何将车把连接到您的导航抽屉
- swift - 我的应用程序可以通过 MacOS App Store 分发(与沙盒斗争)吗?
- r - 如何将标题文本与条形图中的左栏对齐?
- javascript - 同时可能的唯一元素组合的输出数组
- javascript - 通过单击添加类并捕获添加的类