谷歌地图安卓版只显示白屏

5
我已经完成了添加Google Maps API的所有步骤,但我遇到了一些错误。抱歉语言不太好。
09 12:20:55.359: W/dalvikvm(5918): Unable to resolve superclass of Lmaps/a/du; (406)
01-09 12:20:55.359: W/dalvikvm(5918): Link of class 'Lmaps/a/du;' failed
01-09 12:20:55.359: W/dalvikvm(5918): Unable to resolve superclass of Lmaps/a/ej; (2358)
01-09 12:20:55.359: W/dalvikvm(5918): Link of class 'Lmaps/a/ej;' failed
01-09 12:20:55.359: W/dalvikvm(5918): Unable to resolve superclass of Lmaps/j/k; (2374)
01-09 12:20:55.359: W/dalvikvm(5918): Link of class 'Lmaps/j/k;' failed
01-09 12:20:55.359: E/dalvikvm(5918): Could not find class 'maps.j.k', referenced from method maps.y.ae.a
01-09 12:20:55.359: W/dalvikvm(5918): VFY: unable to resolve new-instance 3566 (Lmaps/j/k;) in Lmaps/y/ae;

以下是manifest.xml文件:

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 <uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.READ_PHONE_STATE" />
 <uses-permission android:name="com.comparto.piso.permission.MAPS_RECEIVE" />
 <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

 <permission
        android:name="com.comparto.piso.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" />

       <application
              ........ >
            <uses-library android:name="com.google.android.maps" />
   <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="api key" />
    ......
    .....

在Java代码中,我扩展了FragmentActivity,并在这里提供了onCreate代码。

GooglePlayServicesUtil
                .isGooglePlayServicesAvailable(getApplicationContext());

        GoogleMap map = ((SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map)).getMap();
        if (map != null) {
            map.setMapType(GoogleMap.MAP_TYPE_NORMAL);
        }

这里是布局XML文件。
 <fragment
                xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/map"
                android:layout_width="fill_parent"
                android:layout_height="300px"
                class="com.google.android.gms.maps.SupportMapFragment" />

你的混淆没有起作用,我猜测。 - njzk2
1
请编辑并添加您代码的相关部分。即使您不懂英语,这也不是提问的正确方式。 - Nezam
好的,我现在会编辑并添加更多代码。抱歉。 - Damian SIlvera
1
关闭Proguard并向我们显示正常日志。 - Leonidos
1
嘿,达米安,我一直在使用地图,但是我从来没有在清单上声明API密钥,而是总是在视图中尝试这样做,请以这种方式告诉我是否有效,我不确定这是否正确。 - B. TIger
6个回答

5

如果您的设备与Google Maps库使用的API级别不同,则在logcat中Dalvik显示的所有"无法解析超类xxxx"和"类xxxx的链接失败"都是正常的。

您应该使用以下命令检查是否出现授权失败:

adb logcat | grep Maps

如果你看到这样的内容:
E/Google Maps Android API(): Authorization failure.

那就意味着在你的清单文件(manifest)中没有提供正确的API密钥。请再次检查你在Google API控制台中的API访问部分,是否已经添加了正确的指纹和包名匹配,详见指南


2

我也遇到了相同的白屏问题,经过一番调查后发现我忘记在开发者控制台中启用地图API,如下图所示:

我希望你可能也遇到了同样的问题,这将有所帮助:

在控制台上启用地图API


1

通常在运行设备上没有可用的 Google Play API 时会出现该错误消息。您调用 isGooglePlayServicesAvailable(),但未检查返回值。在继续之前,应检查它是否返回ConnectionResult.SUCCESS。对于其他一些错误代码,您可以通过getErrorDialog()提示用户升级/安装,例如--

int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
switch (resultCode) {
   case ConnectionResult.SUCCESS: // proceed
      break;
    case ConnectionResult.SERVICE_MISSING:
    case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED:
    case ConnectionResult.SERVICE_DISABLED:
          Dialog dialog = GooglePlayServicesUtil.getErrorDialog(resultCode, this, 1);
          dialog.show();
 }

根据谷歌的说法,Google Play服务API需要“物理开发设备”,因此它们在模拟器上没有得到官方支持。因此,如果您在模拟器上运行,几乎可以确定您缺少所需的服务。有人报告说他们在模拟器中成功运行了它,但我自己没有尝试过。如果您想在模拟器上安装Google Play,请查看this post中的答案。

我正在真实设备上运行测试并获得成功。Logcat 中的错误是:无法找到类“maps.j.k”,该类被方法 maps.y.ae.a 引用。 - Damian SIlvera
好的。您是否已经安装并更新了谷歌地图?请查看您的日志跟踪开头,看看是否有类似于“E/Google Maps Android API(14657): Google Maps application is missing.”的内容。 - iagreen
请参考此答案以了解如何在您的应用程序中进行编程检查。 - iagreen
看起来已经全部安装完毕了,在片段标签中我得到的是 http://postimage.org/image/y21oak6jf/。 - Damian SIlvera
好的,那么我唯一的建议就是检查您是否已正确添加了调试和发布密钥到Google API控制台,并且启用了Google Maps Android v2,而不是意外地只启用了Google Maps v2。 - iagreen

0

您缺少 API 密钥

 <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="api key" />

在value参数中输入api_key

而且google playService版本也缺失了。请添加。

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

<application标签内部添加manifest


0
如果您在布局xml中使用“class="com.google.android.gms.maps.SupportMapFragment",则表示您的manifest.xml文件中的android:minSdkVersion为Android 3.0或更低版本。
然后,请查看下面我提供的链接,这对您理解在设备上运行Google地图之前应安装和设置什么非常有帮助。此链接非常简单,您将得到所需的操作,以便在设备上显示谷歌地图。 我的链接网站 ===> 在这里点击即可

我下载了你的示例并遇到了同样的问题。我在两个不同的设备上运行该项目,结果相同。抱歉语言表达不好,谢谢你的回答。 - Damian SIlvera
你尝试将API密钥输入到Manifest.xml的<meta-data>中了吗? - BBonDoo

0

也许您的 Eclipse 的 SHA1 密钥已更改(例如:您可能已删除 Windows 主文件夹中的 .android 文件夹),这就是为什么会出现身份验证错误的原因。您必须删除密钥并使用新的 Eclipse SHA1 创建新密钥。

在此处重新生成新密钥,并在几分钟后重新加载此页面,它将更新新密钥: https://console.developers.google.com/project/watchful-net-796/apiui/credential

记住!最后,您必须将新密钥复制到清单中并重新构建项目。祝你好运!


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