【问题标题】:Google maps suddenly not working谷歌地图突然不能用了
【发布时间】:2014-07-11 10:17:10
【问题描述】:

突然间,地图在我的应用程序中停止工作,只显示一个空白屏幕,左下角带有谷歌徽标。

我得到的错误是:

I/Google Maps Android API﹕ Google Play services package version: 4452038
I/ActivityManager﹕ Start proc com.google.android.gms.maps for service com.google.android.gms/.maps.auth.ApiTokenService: 
I/Google Maps Android API﹕ Google Play services client version: 4452000
I/Google Maps Android API﹕ Failed to contact Google servers. Another attempt will be made when connectivity is established.
E/Google Maps Android API﹕ Failed to load map. Error contacting Google servers. This is probably an authentication issue (but could be due to network errors).

我认为唯一可能的是身份验证错误。因为我已经尝试过不同的网络并且在那里没有遇到麻烦。

问题可能出在 build.gradle 文件上吗?因为问题是在我搞砸之后开始的,我想。

这是我的构建 gradle:

apply plugin: 'android'

android {
compileSdkVersion 19
buildToolsVersion "19.0.3"

def versionPropsFile = file('version.properties')

if (versionPropsFile.canRead()) {
    def Properties versionProps = new Properties()

    versionProps.load(new FileInputStream(versionPropsFile))

    def value = 0

    def runTasks = gradle.startParameter.taskNames
    if ('assemble' in runTasks || 'assembleRelease' in runTasks || 'aR' in runTasks) {
        value = 1;
    }

    def versionMajor = 1
    def versionMinor = 3
    def versionPatch = versionProps['VERSION_PATCH'].toInteger() + value
    def versionBuild = versionProps['VERSION_BUILD'].toInteger() + 1
    def version_Code = versionProps['VERSION_CODE'].toInteger() + value

    versionProps['VERSION_PATCH'] = versionPatch.toString()
    versionProps['VERSION_BUILD'] = versionBuild.toString()
    versionProps['VERSION_CODE'] = version_Code.toString()

    versionProps.store(versionPropsFile.newWriter(), null)

    defaultConfig {
        versionCode version_Code
        versionName "${versionMajor}.${versionMinor}.${versionPatch} (${versionBuild})"
        minSdkVersion 14
        targetSdkVersion 19
    }
} else {
    throw new GradleException("Could not read version.properties!")
}

signingConfigs {
    debug {
        storeFile file("xxx.keystore")
        storePassword "xxxx"
        keyAlias "debug"
        keyPassword "xxxx"
    }
    releaseKey {
        storeFile file("xxx.keystore")
        storePassword "xxxx"
        keyAlias "release"
        keyPassword "xxxx"
    }
}

buildTypes {
    debug {
        debuggable true
        packageNameSuffix ".debug"
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        signingConfig signingConfigs.debug
    }

    release {
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        signingConfig signingConfigs.releaseKey
    }
}

lintOptions {
    abortOnError false
}
}

dependencies {
    compile project(':nineOldAndroids')
    compile project(':expListViewLib')
    compile project(':datetimepickerlibrary')
    compile project(':volley')
    compile 'com.android.support:support-v4:+'
    compile 'com.google.android.gms:play-services:+'
    compile files('libs/aws-android-sdk-1.7.1.1.jar')
    compile files('libs/disklrucache-2.0.1.jar')
}

清单如下所示:

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

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

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

<uses-permission android:name="com.example.app.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"/>
<uses-permission android:name="android.permission.VIBRATE" />

<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.gms.version" android:value="@integer/google_play_services_version" />
    <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="@string/config_com.google.android.maps.v2.api_key" />
</application>
</manifest>

我已多次检查 packageName、sha1 指纹和 API 是否正确。他们都是,但我仍然得到一张空地图。

我看到过类似的问题,但没有找到任何解决方案。它只是拒绝为我工作。

有什么建议吗?

编辑: 我尝试过的任何东西都不起作用。但我确实找到了一个与似乎有同样问题的人类似的问题:Google Maps Android API Authorization failure - has this service changed in the last few months?

【问题讨论】:

  • 签名(调试和发布)都发生了吗?
  • @betorcs 是的,即使我将调试添加到 google api 面板,也无法处理其中任何一个。
  • 我在某处读到它可能是 proguard 配置错误,请尝试禁用它runProguard false
  • 我可以重现这个错误。它看起来应用程序缓存了你的 api_key,我需要干净的数据或卸载现有的应用程序,仅覆盖是不够的。
  • 我也有同样的问题。我完全可以重现这个。

标签: android google-maps android-studio google-maps-android-api-2


【解决方案1】:

我遇到了完全相同的问题,解决方案一点也不明显。检查您是否没有更改 DefaultSSLSocketFactory:

HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());

删除这条线并为所需的连接设置套接字工厂使我的地图工作。

【讨论】:

  • 这解决了我的问题。太感谢了!你是怎么想出来的?
  • 几乎是偶然的。在调试和挖掘项目期间,地图无法正常工作,我发现谷歌使用 https 地址进行身份验证。我想出了检查连接属性的想法,这是一个好主意。
  • 能否提供详细信息?该代码在哪里? "HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());"
  • 在我的班级里负责 HTTPS 连接。在创建连接套接字之前。
  • 您能否通过代码示例做出更好的解释来纠正这个问题?由于我的连接处理,我的地图无法正常工作,我已经对其进行了测试,但我不知道如何仅为我自己的服务器连接保留 SSL
猜你喜欢
  • 1970-01-01
  • 2010-11-25
  • 2015-04-21
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 2020-11-30
  • 2018-03-03
  • 1970-01-01
相关资源
最近更新 更多