Google地图未创建,回调函数永远不会运行

时间:2017-10-06 19:34:25

标签: google-maps xamarin.android

我正在尝试将谷歌地图支持添加到我的Android应用程序中。当我在代码中创建整个应用程序布局时,我想在代码中创建地图对象。这是应该处理OnMapReady回调函数的类。

public class MapReader : Java.Lang.Object, IOnMapReadyCallback
{
    private LayoutBuilder layoutBuilder;
    public MapReader(LayoutBuilder lb)
    {
        layoutBuilder = lb;
    }
    public void OnMapReady(GoogleMap googleMap)
    {
        layoutBuilder.OnMapLoaded(googleMap);
    }
}

这是创建布局的代码的关键部分。

MapView mapView=new MapView(context);
mapView.LayoutParameters = layoutParams;
linearLayout.AddView(mapView);

mapReader = new MapReader(this);
mapView.GetMapAsync(mapReader);

问题是我没有错误/异常。 永远不会调用OnMapReady函数,屏幕只是空的。什么可能是错的或如何获得有关此类行为的其他信息?我试图按照video的步骤进行操作。在输出窗口中,我试图找到可能有用的行:

Loaded assembly: /storage/emulated/0/Android/data/AlienChessAndroid.AlienChessAndroid/files/.__override__/Xamarin.GooglePlayServices.Base.dll [External]
Loaded assembly: /storage/emulated/0/Android/data/AlienChessAndroid.AlienChessAndroid/files/.__override__/Xamarin.GooglePlayServices.Basement.dll [External]
Loaded assembly: /storage/emulated/0/Android/data/AlienChessAndroid.AlienChessAndroid/files/.__override__/Xamarin.GooglePlayServices.Maps.dll [External]

输出窗口中有几行看起来不太好但是应用程序运行。

AOT module 'Mono.Android.dll.so' not found: dlopen failed: library "/data/app/AlienChessAndroid.AlienChessAndroid-1/lib/arm/libaot-Mono.Android.dll.so" not found
AOT module '/storage/emulated/0/Android/data/AlienChessAndroid.AlienChessAndroid/files/.__override__/Xamarin.Android.Support.v4.dll.so' not found: dlopen failed: library "/data/app/AlienChessAndroid.AlienChessAndroid-1/lib/arm/libaot-Xamarin.Android.Support.v4.dll.so" not found
AOT module '/Users/builder/data/lanes/4009/3a62f1ea/source/monodroid/builds/install/mono-armv7/lib/mono/aot-cache/arm/Xamarin.Android.Support.v4.dll.so' not found: dlopen failed: library "/data/app/AlienChessAndroid.AlienChessAndroid-1/lib/arm/libaot-Xamarin.Android.Support.v4.dll.so" not found

这是我的清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="AlienChessAndroid.AlienChessAndroid" android:versionCode="1" android:versionName="1.0" android:installLocation="preferExternal">
<uses-sdk android:minSdkVersion="22" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application android:label="Alien Chess" android:icon="@drawable/Alien" android:largeHeap="true">
    <meta-data android:name="com.google.android.gms.version" android:value="2" />
    <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyAmxxxxxxxxxxxxxxxxxxxxxxxxx" />
</application>

更新:

我添加了检查谷歌服务可用性,如here所示,它返回ConnectionResult.Success。

GoogleApiAvailability gaa=GoogleApiAvailability.Instance;
int resultCode=gaa.IsGooglePlayServicesAvailable(context);
if (resultCode ==ConnectionResult.Success)
{
    ...
}

阅读this question后,我更改了行

<meta-data android:name="com.google.android.gms.version" android:value="2" />

<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />

没有任何改变。

1 个答案:

答案 0 :(得分:1)

在你身上,我会尝试在你的布局axml中创建LinearLayout和MapView(如果可以的话)以确保它应该是这样,当它需要调用GetMapAsync时获取地图在其上使用FindViewById<MapView>的资源ID。

地图的设置和GetMapAsync的通话应在OnStartOnResume内完成。

创建IOnMapReadyCallback之后,您还可以尝试直接添加这样的事件处理程序,看看它是否被调用:

mapReader.MapReady += (sender, args) => { };

在具有最新Android版本的设备上以及Android 5.x上同时尝试使用您的代码,这样您就可以确定在Android 6.0引入的运行时请求权限时没有问题。< / p>