Android Google Maps API V2出现“无法加载地图。联系Google服务器时出错”的问题。

24
我已经尝试在过去的两天里使用v2 API在我的Android应用程序中添加Google地图,但一直没有成功。每次我得到的都是一个错误信息:

Google Maps Android API(16603): Failed to load map. Error contacting Google servers. This is probably an authentication issue (but could be due to network errors).

我已经按照Google的设置教程 (https://developers.google.com/maps/documentation/android/start) 进行操作,多次尝试了不同的项目和工作区,并使用不同的Google账户,还查看了StackOverflow提供的各种答案和建议,但都没有成功。

我正在使用Eclipse 4.2.2和Android SDK Tools 22.01,并安装了Google Play服务(rev. 7),同时我已将google-play-services_lib导入到我的工作区并将其引用到我的Android项目中。

以下是我的代码:

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.googlemapdemo"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="17" />

<permission
    android:name="com.example.googlemapdemo.permission.MAPS_RECEIVE"
    android:protectionLevel="signature" />
<uses-permission android:name="com.example.googlemapdemo.permission.MAPS_RECEIVE"/>

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<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" />

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true"/>

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.googlemapdemo.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="my_api_key" />
</application>

</manifest>

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:id="@+id/the_map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.SupportMapFragment"
/>

MainActivity.java

package com.example.googlemapdemo;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;

public class MainActivity extends FragmentActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

同时我在 https://code.google.com/apis/console/ 上创建了一个API项目,并启用了 Google Maps Android API v2 服务。然后我使用以下命令获取了我的SHA1调试证书指纹:

keytool -list -v -keystore "C:\Users\my_user_name\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android

我输入了包名和API密钥,并将其放入清单文件中(其中my_api_key是密钥)。我重复了这个过程多次,重新生成密钥,但结果相同。

是否有人可以帮忙或建议其他尝试的方法?非常感谢任何帮助!


5
你完全从手机上删除了该应用并重新安装了它吗? - user
是的,并尝试多次重新生成它。我还尝试了不同的谷歌账户。 - pharlez
重新安装应用程序对我来说是解决办法 :D - User
是的,这对我也有效。 - jimsis
1
同时,在Google控制台中添加新密钥需要一些时间来传播。 - tomash
显示剩余2条评论
17个回答

25

简单。

如果您确定API密钥是正确的,但Logcat仍然出现此错误, 那么请尝试以下操作:

  1. 从设备中卸载应用程序。
  2. 清理项目。
  3. 再次在设备上运行。

地图现在应该显示在设备上...这对我有用...干杯:)


它可以工作了,非常感谢。 - Serkan

22

在关闭我正在使用的设备上的 WiFi 后,终于找到了。看来在通过 WiFi 进行调试时,你也需要

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

在清单文件中添加了这个权限,不知道是不是只有我的情况还是普遍存在的问题,但我认为它应该出现在文档中的某个地方(但它没有出现)。

因此,如果您正在阅读此内容并且遇到类似的问题,请尝试禁用WiFi或将上述权限添加到其他权限中。


2
是的!谢谢。API v2教程建议使用android.permission.ACCESS_NETWORK_STATE权限,但不建议使用android.permission.ACCESS_WIFI_STATE - Tom Quinn
3
这个对我没有帮助。但是我找到了解决方案,请看我的答案:https://dev59.com/02Mm5IYBdhLWcg3wX-AW#17947755 - Oleksii K.
1
没有帮助我,但当我清除了数据并卸载了应用程序后,地图现在可以使用了。 - Glenn
Pharlez,我已经启用了WiFi并获取了所需的权限,但地图加载失败,出现了与你遇到的完全相同的错误。 - Kaps
我也可以确认,添加(未记录为必需)权限android.permission.ACCESS_WIFI_STATE解决了我的问题。 - vap78
只需清除数据(设置->应用程序->选择应用程序->清除数据->卸载)并尝试。这对我有用。如果您是从自定义密钥库创建SHA1代码,请在发布模式下使用相同的代码。或者通过使用该密钥库进行签名来生成apk。 - Suchith

10

请确保您仔细遵循文档中的说明:

https://developers.google.com/maps/documentation/android/start#obtain_a_google_maps_api_key

在新的ADT版本中,您应该在logcat查看器中看到一个错误消息,其中会给出明确的说明,例如去哪里,启用什么以及您需要复制到 Android 指纹和应用详情中的详细信息。请参见下面的内容;

enter image description here

几个要注意的事项;

  1. 在开发者控制台中同时启用 Google Maps Android API v2Google Play Android Developer API!这让我摸不着头脑 :)

  2. 确保您使用正确的密钥库来查找 SHA1 哈希值 (可以通过前往window->preferences->android->build 并查找 SHA1 找到),此哈希值将与您的生产密钥库不同!否则,您可以使用 keytool -list -v -keystore YOURKEYSTORE.keystore -alias YOURALIAS 查看 SHA1

  3. 将您的 <meta-data> 元素添加到 您的 <application> 标记内部

  4. 将您的 <meta-data> 元素添加到 <.manifest> 标记内部(在<application>标记上方)


5

这个权限解决了问题。

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> 

3

我遇到了同样的问题,并发现这组权限可以解决问题。

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

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

android:value="my_api_key" 应该替换成您从https://code.google.com/apis/console获取的实际密钥。


我知道,在我的问题结尾处写了,我从API控制台获取了一个实际的密钥并将其放在那里,还尝试了多个密钥。 - pharlez
抱歉。尝试在您的onCreate方法中添加以下内容: GoogleMap map = ((MapFragment) getFragmentManager().findFragmentById(R.id.the_map)) .getMap();此外,我的地图片段如下所示:也许尝试更改为这个并查看是否有效? - user1154920
刚刚试了一下,结果还是一样的... - pharlez
@pharlez,您是否参考了Google Play服务库项目?您是否在API控制台中启用了Android地图? - Raghunandan
@Raghunandan 我在API控制台中启用了Android API V2的地图功能,同时我还在Eclipse中导入了google-play-services_lib并通过属性/Android将其引用到我的Android项目中。 - pharlez
显示剩余2条评论

2

我认为这是您的API密钥的问题。

尝试从新项目中获取Android地图(Google Play服务)示例项目。

并将您的API密钥添加到maps AndroidManifest.xml文件中。

如果仍然无法正常工作,则可能是API密钥的问题。


2

我的解决方案是使用正确的文件

在我的情况下,我使用了 C:\Users\.android 中的 debug.keystore 生成 SH1 密钥

试了很多次后,我发现在 C:\Users\\Downloads\adt-bundle-windows-x86_64\adt-bundle-windows\sdk.android 中找到了另一个文件,并使用它来生成 SH1 密钥

然后复制 45:B5:E4:6F:36:AD:0A:98:94:B4:02:66:2B:12:17:F2:56:26:A0:E0 值的 API 密钥网站

所有工作正常


2
请确保在Google APIs控制台的服务下启用了“Google Maps Android API v2”(见下方截图)。如果未启用,则即使您输入了SHA1密钥,也不会收到指示该服务已禁用的错误信息。
请参考以下截图:截图

2

仅仅是想说,我确信自己做得非常好,但最终我发现项目中的包名与AndroidManifest.xml中声明的不同,因此与Google API控制台中的也不同。

猜猜怎么着,我改了它...然后,它奏效了!

所以对于来到这里的人,也要检查一下!


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