谷歌地图API V2“无法加载地图。无法联系谷歌服务器”,即使我检查了权限和密钥库。

8
我按照指南创建了一个谷歌地图样例,但它一直显示以下错误。
E/Google Maps Android API(27821): Failed to load map.  Could not contact Google servers.

权限READ_GSERVICES以及debug和release keystore已经测试过。它们也不能解决上述问题。有人可以告诉我为什么会抛出这个错误吗?

清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.where.common"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />
    <permission
        android:name="com.where.common.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" />
    <uses-permission android:name="com.where.common.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.com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <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" >
        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="AIzaSyDawEkMP7gdiB4nOOkXcdUcxSAvm0kfCmI" />
        <activity
            android:name="com.where.common.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>
    </application>
</manifest>

Java文件:

package com.where.common;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

    @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;
    }

}

查看文件:

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

7

请确保以下所有要点都已得到处理:

1) 启用了错误的服务。请确保启用了 "Google Maps Android API v2",而不是 "Google Maps API v2" 并重新生成 API 密钥。

2) 将以下元素添加到您的清单中。请将"com.example.mapdemo 替换为应用程序的包名称"。

3) 使用正确的证书和密钥。发布证书在调试时运行应用程序时将无法工作。您必须使用调试 keystore 证书指纹。


非常感谢@Monika Sharma。经过3个小时的挣扎,我终于解决了问题。 - Meher
天啊,我感觉自己像个傻瓜...我激活了“Google Maps API v2”,而不是“Google Maps Android API v2”... - AndroidNoob

7

在尝试新的API KEY之前,请不要忘记清除程序缓存 :) 因为即使您更改了API KEY,Android仍将使用第一个API KEY。


花了2个小时在代码中搜索,尝试了每一个愚蠢的解决方案,安装和卸载应用程序等等。我以为在调试时不需要清除应用数据。我不吸烟,但不得不抽烟。谢谢。 - Artur
好家伙,我谷歌了几个小时,在如何解决这个问题方面找到了数百万的建议......但没有人提到过这个!在卸载和重新安装后,我终于让MapDemo起作用了。感谢Emre! - EboMike

4

我曾经遇到过同样的问题。尽管创建了API密钥很多次,问题仍然存在。接着我只是卸载了应用程序并重新安装了它。基本上这个应用程序在缓存内存中存储了错误的API密钥凭据。当我们重新运行应用程序时,它只是从缓存中加载。因此,重新安装应用程序解决了我的问题。


4
你添加了所有其他所需的权限吗?
<permission android:name="com.eadesign.skygiraffefinalv2.permission.MAPS_RECEIVE" android:protectionLevel="signature"/>
<uses-permission android:name="com.eadesign.skygiraffefinalv2.permission.MAPS_RECEIVE"/>
<uses-permission android:name="android.permission.INTERNET" />
<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-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

更新:

1. 应用程序标签的meta-data部分应该放在最下面,像这样:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.where.common"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="16" />
<permission
    android:name="com.where.common.permission.MAPS_RECEIVE"
    android:protectionLevel="signature" />
<uses-permission android:name="com.where.common.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.com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<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.where.common.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="AIzaSyDawEkMP7gdiB4nOOkXcdUcxSAvm0kfCmI" />
</application>

2. 我看到的另一个问题是,您正在开发适用于API V8的应用程序,因此必须使用SupportMapFragmentFragmentActivity来处理您的Activity

3. 最后,为使您的地图正常工作,您需要添加一个许可证活动以获取Google许可信息。


另一个问题是,从许多Google地图示例指南中我看到的是,它们没有说明我们需要许可证活动。 - xinglinCai
当您设置目标API版本时,应将其设置为可用的最新版本,并描述您希望在应用程序中使用哪些功能。而MinAPI则是描述您的应用程序应该在哪个最低API上工作,这取决于您是否使用了较新的API功能。 - Emil Adz
那么,这可能与您正在生成的密钥有关,或者您可能在API控制台中打开了错误的API。 - Emil Adz
我找到了原因。谢谢。 - xinglinCai
同样的问题。无法加载地图。无法连接到Google服务器。但我可以看到缩放控件。:( - Meher
显示剩余10条评论

4
最后,我找到了为什么会发生这种情况的原因。是因为我写了:
<uses-permission android:name="android.permission.com.google.android.providers.gsf.permission.READ_GSERVICES" />

这是错误的。应该是

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

在这里,我要感谢Emil Adz的耐心帮助!


1
如果他的回答帮助了你,你应该给他一个赞作为感谢。 - jprofitt

2

你解决了这个问题吗?也许这就是问题所在 ->

错误的服务已被启用。请确保已启用“Google Maps Android API v2”,而不是“Google Maps API v2”,然后重新生成API密钥。(https://dev59.com/2mYr5IYBdhLWcg3wR4Qs#13805807

如果这是问题的原因,请不要忘记重新生成API密钥。


0

检查权限

<uses-permission android:name="android.permission.INTERNET" />
<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-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true" />

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

0
我通过在布局类中添加对我的片段的支持来解决了这个问题:
class="com.google.android.gms.maps.SupportMapFragment"

0

我遇到了与user2204477相似的问题。我有

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

应该是这样的

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

注意错误的那个写成了“permissions”,而正确的应该是“permission”。我刚刚浪费了5个小时来解决这个问题,哈哈。

0

我也有同样的问题!重装了50遍。在删除之前,只需清除Android设备上应用程序的缓存并删除所有数据即可。这很有帮助,感谢上苍...


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