Error de autorización de la API v2 de Google Maps para Android


95

Mis pasos:

  • obtuve el código SHA1 de debug.keystore
  • crear aplicación en la consola de google apis
  • habilitado google map api v2
  • input SHA1; my.package.name
  • obtener clave API
  • creado el archivo AndroidManifest:

        <permission
                android:name="my.package.name.permission.MAPS_RECEIVE"
                android:protectionLevel="signature"/>
    
        <uses-permission android:name="my.package.name.permission.MAPS_RECEIVE"/>
    
        <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15"/>
    
        <uses-permission android:name="android.permission.INTERNET"/>
        <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-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    
        <uses-feature android:glEsVersion="0x00020000" android:required="true"/>
    
        <application android:label="@string/app_name" android:icon="@drawable/ic_launcher" android:hardwareAccelerated="true">
    
            <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="MY_API_KEY_HERE" />
    
            <activity android:name="MyActivity"
                      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>
    
  • diseño creado

  • poner "google-play-services.jar" en libs

Después de la compilación, tengo un bloqueo:

  ERROR/AndroidRuntime(10182): FATAL EXCEPTION: main
                java.lang.NoClassDefFoundError: com.google.android.gms.R$styleable
                at com.google.android.gms.maps.GoogleMapOptions.createFromAttributes(Unknown Source)
                at com.google.android.gms.maps.MapFragment.onInflate(Unknown Source)
                at android.app.Activity.onCreateView(Activity.java:4716)
                at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:466)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
                at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
                at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:270)
                at android.app.Activity.setContentView(Activity.java:1881)
                at com.example.gm2.MyActivity.onCreate(MyActivity.java:16)
                at android.app.Activity.performCreate(Activity.java:5104)
                at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
                at android.app.ActivityThread.access$600(ActivityThread.java:141)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
                at android.os.Handler.dispatchMessage(Handler.java:99)
                at android.os.Looper.loop(Looper.java:137)
                at android.app.ActivityThread.main(ActivityThread.java:5039)
                at java.lang.reflect.Method.invokeNative(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:511)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
                at dalvik.system.NativeStart.main(Native Method)

Después de eso, cambié el diseño a:

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:id="@+id/map"
             android:layout_width="match_parent"
             android:layout_height="match_parent" />

y cambió MyActivity a

  super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();

    transaction.add(R.id.map, MapFragment.newInstance());           
    transaction.commit();

Como resultado, se inició la aplicación, pero no vi el mapa.

Registro de la consola:

ERROR/Google Maps Android API(10369): Authorization failure.

1
¡DIOS MIO! Siempre tuve el mismo error R $ clase de estilo no encontrada. ¡Ahora cambié mi código a su forma programática de implementar MapFragment y funciona! ¡Gracias! Pero necesita crear su clave como se describe a continuación
Informatic0re

Respuestas:


103

Pasos :

  • para asegurarse de que el dispositivo tenga el APK de los servicios de Google Play
  • para instalar Google Play Service rev. Más de 2

ingrese la descripción de la imagen aquí

  • para crear un proyecto en https://code.google.com/apis/console/
  • para habilitar "Google Maps Android API v2" ingrese la descripción de la imagen aquí
  • para registrar SHA1 en el proyecto ( AHORA, NECESITA ESCRIBIR SHA1; your.app.package.name ) en la consola de API y obtener la CLAVE de API
  • para copiar el directorio ANDROID_SDK_DIR / extras / google / google_play_services / libproject / google-play-services_lib a la raíz de su proyecto
  • para agregar la siguiente línea a YOUR_PROJECT / project.properties

android.library.reference.1=google-play-services_lib

  • para agregar las siguientes líneas al YOUR_PROJECT/proguard-project.txt

.

-keep class * extends java.util.ListResourceBundle {

   protected Object[][] getContents();

}

Ahora está listo para crear su propia aplicación de mapas de Google utilizando las API de mapas de Google V2 para Android.

Si crea una aplicación con un mínimo de SDK = 8, utilice la biblioteca de soporte de Android v4 + SupportMapFragment en lugar de MapFragment.


Estas instrucciones no hicieron todo el trabajo. Necesitaba copiar proguard.cfg de la aplicación de muestra de la API de mapas. Solo entonces empezó a funcionar.
Yoel Gluschnaider

Además, noté que el algoritmo de firma DEBE ser SHA1withRSA y NO SHA256withRSA (el valor predeterminado creado por eclipse para la clave de depuración).
Yoel Gluschnaider

1
¡Gracias! to enable "Google Maps Android API v2" -Paso resolvió mi problema.
Johan

1
@YoelGluschnaider: ¿Cómo puedo cambiar el algoritmo predeterminado de SHA256withRSA a SHA1withRSA?
Santhosh

¡Gracias! Tu idea me salvó de usar SupportMapFragment.
Ilya Kogan

35

También revise esta publicación: El código de muestra de Google Map Android Api V2 no funciona , si está completamente seguro de que siguió los pasos correctos, siga la segunda respuesta, la autenticación se almacena en caché en algún lugar, intente desinstalar la aplicación manualmente (al igual que lo hace con un aplicación normal) luego "Ejecutar" nuevamente el proyecto


6
No puedo creer que haya funcionado. Gracias @Alejandro del Rio :)
phil

Apuesto a que, al igual que yo, el 90% de las personas aquí realmente quieren esta respuesta y no la seleccionada (aunque también es útil)
Kalisky

En mi caso, el caché (?) Se actualizó mientras leía Stackoverflow con el mensaje de error de autenticación en el registro. La aplicación se estaba ejecutando con la pantalla while, después de unos minutos se cargó el mapa y no hubo más errores de autenticación. Supongo que una reinstalación también lo habría hecho.
John

2
Para futuros lectores. Eliminar biny gen. Limpiar, reconstruir y renovar las credenciales almacenadas en caché.
George Daramouskas

20

Como acabo de perder mucho tiempo haciendo que la API funcione, intentaré dar una validación paso a paso para la API de mapas v2:

Paso 1: Solicite su clave API

Si no está familiarizado con la consola API de Google, lea la muy buena respuesta de Rusfearuth arriba.

Paso 2: Verifica tu SHA Hash (en este caso uso la clave de depuración de eclipse):

En una máquina con Windows, acceda a su directorio de usuario en un símbolo del sistema:

C:\Users\you>keytool -list -alias androiddebugkey -keystore .android\debug.keyst
ore -storepass android -keypass android

Obtendrás algo como:

androiddebugkey, 15.10.2012, PrivateKeyEntry,
Zertifikat-Fingerprint (SHA1): 66:XX:47:XX:1E:XX:FE:XX:DE:XX:EF:XX:98:XX:83:XX:9A:XX:23:A6

Luego, mire el nombre de su paquete de la actividad del mapa, por ejemplo, com.example.mypackagename

Combina esto y verifica eso con su configuración en la consola API de Google:

66:XX:47:XX:1E:XX:FE:XX:DE:XX:EF:XX:98:XX:83:XX:9A:XX:23:A6;com.example.mypackagename

donde obtienes tu clave API:

AZzaSyDhkhNotUseFullKey49ylKD2bw1HM

Paso 3. Manifestar metadatos

Compruebe si los metadatos están presentes y contienen la clave correcta. Si libera su aplicación, necesita una clave diferente.

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

Paso 4. Características manifiestas:

Necesita esta entrada ya que la API de mapas requiere cierto soporte de gráficos:

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

No se preocupe, el 99,7% de los dispositivos lo admiten.

Paso 5. Biblioteca de manifiestos:

Agregue la biblioteca de Google.

    <uses-library
        android:name="com.google.android.maps"
        android:required="false" /> // This is required if you want your app to start in the emulator. I set it to false also if map is not an essential part of the application.

Paso 6. Permisos manifiestos:

Verifique el nombre del paquete dos veces: com.example.yourpackage

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

Agregue los siguientes permisos:

<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" />

Los siguientes permisos son opcionales y no son obligatorios si solo muestra un mapa. Trate de no usarlos.

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

Paso 7. Incluya el fragmento de mapa en su diseño:

<fragment
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    class="com.google.android.gms.maps.SupportMapFragment"
    map:cameraTargetLat="47.621120"
    map:cameraTargetLng="-122.349594"
    map:cameraZoom="15" />

Si su lanzamiento a las versiones 2.x de Android necesita agregar soporte en su Actividad:

import android.support.v4.app.FragmentActivity;

Para el mapa: las entradas para trabajar incluyen

xmlns:map="http://schemas.android.com/apk/res-auto"

en el diseño de su actividad (por ejemplo, LinearLayout).

En mi caso, tengo que limpiar el proyecto cada vez que cambio algo en el diseño. Parece ser un error.

Paso 8: Utilice Eclipse - Proyecto - Limpio.

¡Disfrutar!


Estoy siguiendo tus pasos pero error en la clave api, ¿alguna solución?
Hemantvc

1
+1 para <meta-data android: name = "com.google.android.maps.v2.API_KEY" android: value = "AZzaSyDhkhNotUseFullKey49ylKD2bw1HM" />
The-null-Pointer-

16

Debes usar el proyecto de la biblioteca ubicado en: ANDROID-SDK-DIRECTORY / extras / google / google_play_services / libproject

Esto solucionará su primer problema.

No estoy seguro del segundo, pero puede ser un efecto secundario del primero. Todavía estoy intentando que el mapa funcione en mi propia aplicación :)


Copié extras / google / google_play_services / libproject / libs / google-play-services.jar en MY_PROJECT / libs.
Rusfearuth

Eso no es suficientemente bueno. Debe utilizar todo el proyecto de la biblioteca, ya que incluye muchos recursos. En Eclipse, puede importar un nuevo proyecto de Android y simplemente apuntarlo al directorio libproject. Luego, en las propiedades de su propio proyecto, agregue una referencia.
Scott Kennedy

No uso Eclipse (use Idea)
Rusfearuth

No estoy seguro de cómo funcionan los proyectos de bibliotecas en Idea, pero blogs.jetbrains.com/idea/2010/09/… debería tener esa información.
Scott Kennedy

17
Descubrí por qué no funcionó. Encendí Google Map API v2 en lugar del servicio Google Map Android API v2. = (
Qué

5

Hoy me enfrenté a este problema. Usé Android Studio 2.1.3, Windows 10. Aunque la depuración funciona bien, pero si actualizo al modo de lanzamiento, no funciona. Borré todas las condiciones de proguard, actualicé, pero esta no fue la solución.

La solución está relacionada con la estructura del proyecto. El archivo google_maps_api.xml era diferente entre app \ src \ debug \ res y app \ src \ release \ res. Hice copia manual y pegado de depuración a carpeta de liberación.

Ahora funciona.


4

Seguí la mayoría, si no todas, de las sugerencias de Gunnar Bernstein mencionadas anteriormente y todavía no funcionó. Sin embargo, comenzó a funcionar después de seguir sus sugerencias Y lo siguiente:

  1. Creé una nueva MapActivity usando la lista de opciones del botón derecho del ratón de Android Studio: Nuevo -> Google -> Actividad de Google Maps

  2. Luego abrí el archivo google_maps_api.xml que se genera automáticamente y usé el enlace indicado para crear una nueva CLAVE de API. Hice todos los pasos y guardé mi nueva clave en mi proyecto actual. Luego eliminé mi antigua CLAVE API registrada ya que ya no era necesaria.

  3. En el archivo de manifiesto, reemplacé el antiguo valor de la CLAVE de la API con el acceso directo de cadena creado por este nuevo archivo XML: android:value="@string/google_maps_key", en lugar de indicar la CLAVE directamente.

  4. Finalmente, elimine el nuevo MapActivity, pero conserve el archivo xml que se creó en ese proceso.

Nota: Al crear la CLAVE API de esta manera, la columna Restricciones, en Credenciales, ahora indica "Aplicaciones de Android". Anteriormente, cuando no funcionaba, la columna decía "Aplicaciones de Android, 1 API" o algo similar. No sé si esto marca la diferencia o no. Nota: No, eso solo significa que no tengo una API específica seleccionada para esta clave de API (Consola -> Clave de API -> Restricciones de clave -> Restricciones de API).

Nota: se parece a la etiqueta de metadatos del archivo de manifiesto:

android:name="com.google.android.maps.v2.API_KEY

ha sido reemplazado por:

android:name="com.google.android.geo.API_KEY"

Supongo que se pueden usar ambos, pero es mejor desde el principio usar el último.

Nota: El valor indicado, en el archivo build.gradle, en android -> defaultConfig -> applicationId tiene que coincidir con el texto del nombre del paquete en la página Credenciales.


Esto es exactamente lo que me sucedió y esta solución solucionó la advertencia de la consola. De alguna manera, la construcción Ionic lo cambió.
astronauta

Después de buscar durante 8 horas, miro hacia atrás y aplico esta solución. Solved!!!
meyasir

3

Simplemente agregue esto en su archivo de manifiesto:

**<uses-library android:name="com.google.android.maps" />**

Por ejemplo...

<application
    android:icon="@drawable/icon"
    android:label="@string/app_name" >
    <uses-library android:name="com.google.android.maps" />

    <activity
        android:name=".California"
        android:label="@string/app_name"
        android:screenOrientation="portrait" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

Y, por favor, actualice su biblioteca de servicio de Google Play ... Vaya a Ventana -> Administrador de SDK de Android-> actualice el servicio de Google Play ... lo instaló ... elimine el anterior y conserve este. Toma esto de ANDROID-SDK-DIRECTORY / extras / google / google_play_services /

Gracias, por favor vote


3

Resolví este error comprobando el nombre del paquete en el manifiesto y la aplicación build.gradle.

En manifiesto:

Estoy usando un nombre de paquete como:

com.app.triapp

En la aplicación build.gradle:

 defaultConfig {

        applicationId "com.app.live"
    }

Después de cambiar a com.app.triappadentro build.gradle, resolvió mi problema.


1
Muchas gracias. Me ahorras una tonelada de tiempo.
YeeKhin

1
Excelente hermano. Tengo todo bien, en lugar de este
Mubashar Javed

2

Estoy migrando de V1 a V2 de Google Maps. Obtuve este error al intentar ejecutar la aplicación a través de Eclipse. La causa principal para mí fue usar mi almacén de claves de certificado de versión en lugar del almacén de claves de depuración de Android, que es lo que se usa cuando lo ejecuta a través de Eclipse. El siguiente comando (OSX / Linux) le dará la clave SHA1 del almacén de claves de depuración:

keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android

Si está usando Windows 7 en su lugar, usaría este comando:

keytool -list -v -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android

Probablemente sea mejor desinstalar la aplicación por completo de su dispositivo antes de intentar con una nueva clave, ya que Android almacena en caché las credenciales de seguridad.


1

"java.lang.NoClassDefFoundError: com.google.android.gms.R $ styleable"

También tuvo este error, debe: Archivo -> importar -> Código de Android existente en el espacio de trabajo -> Examinar -> SDks de Android -> extras -> google -> google_play_services -> lib_project -> google_play_services_lib y OK. Verifique el proyecto y termine.

El proyecto va al Explorador de paquetes. Ahora vaya a su proyecto (con error) -> propiedades -> Android y en la Biblioteca haga clic en Agregar ... ¡google_play_services_lib debería estar allí! agregar y volver a intentar :)


1

Tuve el mismo problema, pero resultó que fue porque creé dos claves API de mapas diferentes con la misma huella digital SHA-1 con un nombre de paquete casi similar com.bla.blay el otro com.bla.bla.something.


0

Tuve exactamente el mismo problema y solo necesitaba configurar el SDK para el proyecto de biblioteca de MapsApiV2 en Android 2.3.3 (API lvl 10)


No recuerdo estas cosas
Informatic0re

0

Tuve el mismo problema. Después de aproximadamente dos horas de buscar en Google, reintentos, regenerar la clave API muchas veces, etc., descubrí que habilité el servicio incorrecto en la consola APis de Google. He habilitado el servicio Google Maps API v2 , pero para las aplicaciones de Android tienes que usar Google Maps Android API v2 . Después de habilitar el servicio correcto, todo comenzó a funcionar.



0

Seguí el mismo paso proporcionado en Google Doc pero recibí el mismo error. Más tarde me di cuenta de que estaba firmando mi aplicación con mi app.keystore y la clave SHA que estaba usando para generar la clave API era la de depuración.

Así que simplemente eliminé el signingConfig signingConfig.genericde porbuild.gradle archivo de y mi mapa comenzó a funcionar bien.

Espero que esto ayude a alguien.


0

Me enfrenté al mismo problema.

Si emitió una API para su versión de lanzamiento de la aplicación. Entonces esa API solo funcionará para la versión de lanzamiento, no para la versión de depuración. Así que asegúrese de estar usando la versión de lanzamiento en su teléfono o emulador.


0

Para mí, todo funcionaba tanto en un emulador como en un dispositivo físico.

Sin embargo, dejó de funcionar para mí cuando configuré una segunda máquina para depurar la misma aplicación en un emulador con un nivel de API más nuevo.

No me di cuenta que la huella dactilar de esa máquina había cambiado. Después de ver el registro de errores de autenticación en el Registro del dispositivo, comparé de cerca la huella digital en mi Consola para desarrolladores de Google con la del mensaje de error. Fue entonces cuando vi la diferencia. Después de agregar la nueva huella digital a la Consola del desarrollador (en combinación con el nombre del paquete), mi aplicación comenzó a funcionar como se esperaba en el emulador del nuevo sistema.

Entonces, si configura un nuevo sistema, ¡revise sus huellas digitales nuevamente!


0
  • Asegúrese de que Maps SDK for Androidesté habilitado en la consola de API.
  • Además, es posible que deba agregar el nombre de su paquete y la huella digital del certificado de firma SHA-1 para restringir el uso para que su clave esté completamente habilitada.

ingrese la descripción de la imagen aquí

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.