Google Maps de repente no funciona

De repente, los mapas dejaron de funcionar en mi aplicación y solo muestra una pantalla en blanco con el logotipo de Google en la esquina inferior izquierda.

El error que obtengo es:

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).

Lo único que creo que es posible es un error de autenticación. Desde que lo he probado en diferentes redes y no tengo problemas allí.

¿Podría ser el problema con el archivo build.gradle? Porque los problemas comenzaron después de que me metí por ahí, creo.

Esta es mi construcción 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')
}

el manifiesto tiene el siguiente aspecto:

<?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>

He comprobado varias veces que packageName, sha1 fingerprint y API son correctos. Todos lo son, pero todavía obtengo un mapa vacío.

He visto preguntas similares pero ninguna de las soluciones que encontré. Simplemente se niega a trabajar para mí.

¿Alguna sugerencia?

EDITAR: Nada de lo que he probado funciona. Pero encontré una pregunta similar con alguien que parece tener el mismo problema:Error de autorización de API de Android de Google Maps: ¿ha cambiado este servicio en los últimos meses?

Respuestas a la pregunta(1)

Su respuesta a la pregunta