Errore di autorizzazione dell'API Android v2 di Google Maps


95

I miei passi:

  • ha ottenuto il codice SHA1 da debug.keystore
  • creare app nella console API di Google
  • abilitato google map api v2
  • input SHA1; my.package.name
  • ottieni la chiave API
  • creato file 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>
    
  • layout creato

  • metti "google-play-services.jar" nelle librerie

Dopo la compilazione ho un crash:

  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)

Dopo di che ho cambiato il layout in:

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

e modificato MyActivity in

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

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

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

Di conseguenza, l'applicazione è stata avviata, ma non ho visto la mappa.

Registro della console:

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

1
OH MIO DIO! ho sempre avuto lo stesso errore R $ classe stylable non trovata. Ora ho cambiato il mio codice nel tuo modo programmatico per implementare MapFragment e funziona! Grazie! Ma è necessario creare la chiave come descritto di seguito
Informatic0re

Risposte:


104

Passaggi :

  • per garantire che il dispositivo disponga dell'APK di Google Play Services
  • per installare Google Play Service rev. più di 2

inserisci qui la descrizione dell'immagine

  • per creare il progetto su https://code.google.com/apis/console/
  • per abilitare "Google Maps Android API v2" inserisci qui la descrizione dell'immagine
  • per registrare SHA1 nel progetto ( ORA, DEVI SCRIVERE SHA1; your.app.package.name ) nella console delle API e ottenere la chiave API
  • per copiare la directory ANDROID_SDK_DIR / extras / google / google_play_services / libproject / google-play-services_lib nella root del tuo progetto
  • per aggiungere la riga successiva a YOUR_PROJECT / project.properties

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

  • per aggiungere le righe successive al file YOUR_PROJECT/proguard-project.txt

.

-keep class * extends java.util.ListResourceBundle {

   protected Object[][] getContents();

}

Ora sei pronto per creare la tua app Google Map utilizzando le API di Google Map V2 per Android.

Se crei un'applicazione con un SDK minimo = 8, utilizza la libreria di supporto Android v4 + SupportMapFragment invece di MapFragment.


Queste istruzioni non hanno fatto tutto il lavoro. Avevo bisogno di copiare proguard.cfg dall'applicazione di esempio dell'API delle mappe. Solo allora ha iniziato a funzionare.
Yoel Gluschnaider

Inoltre, ho notato che l'algoritmo di firma DEVE essere SHA1withRSA e NON SHA256withRSA (il valore predefinito creato da eclipse per la chiave di debug).
Yoel Gluschnaider

1
Grazie! to enable "Google Maps Android API v2" -step ha risolto il mio problema.
Johan

1
@YoelGluschnaider: Come posso cambiare l'algoritmo predefinito da SHA256withRSA a SHA1withRSA?
Santhosh

Grazie! Sono stato salvato dalla tua idea di usare SupportMapFragment.
Ilya Kogan

35

Controlla anche questo post: Google Map Android Api V2 Sample Code non funziona , se sei completamente sicuro di aver eseguito i passaggi giusti, segui la seconda risposta, l'autenticazione viene memorizzata nella cache da qualche parte, prova a disinstallare l'applicazione manualmente (proprio come fai con un normale applicazione) quindi "Esegui" nuovamente il progetto


6
Non posso credere che abbia funzionato. Grazie @Alejandro del Rio :)
phil

Scommetto che, proprio come me, il 90% delle persone qui vuole davvero questa risposta e non quella selezionata (anche se utile)
Kalisky

Nel mio caso la cache (?) È stata aggiornata mentre leggevo Stackoverflow con il messaggio di errore di autenticazione nel registro. L'app era in esecuzione con schermo, dopo pochi minuti la mappa è stata caricata e non ci sono più errori di autenticazione. Immagino che anche una reinstallazione l'avrebbe fatto.
Giovanni

2
Per i futuri lettori. Elimina bine gen. Pulisci, ricostruisci e le credenziali memorizzate nella cache vengono rinnovate.
George Daramouskas

20

Poiché ho perso molto tempo per far funzionare l'API, cercherò di fornire una convalida dettagliata per l'API Map v2:

Passaggio 1: richiedi la tua chiave API

Se non hai familiarità con la console API di Google, leggi l'ottima risposta di Rusfearuth sopra.

Passaggio 2: verifica l'hash SHA (in questo caso utilizzo la chiave di debug di eclipse):

Su una macchina Windows, accedi alla tua directory utente su un prompt dei comandi:

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

Otterrai qualcosa come:

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

Quindi controlla il nome del pacchetto dell'attività sulla mappa, ad esempio com.example.mypackagename

Combina questo e lo controlli con le tue impostazioni nella console dell'API di Google:

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

dove prendi la tua chiave API:

AZzaSyDhkhNotUseFullKey49ylKD2bw1HM

Passaggio 3. Metadati manifest

Controlla se i metadati sono presenti e contengono la chiave giusta. Se rilasci la tua app, hai bisogno di una chiave diversa.

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

Passaggio 4. Funzionalità manifest:

Hai bisogno di questa voce poiché l'API della mappa richiede un supporto grafico:

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

Non preoccuparti, il 99,7% dei dispositivi lo supporta.

Passaggio 5. Libreria manifest:

Aggiungi la libreria 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.

Passaggio 6. Autorizzazioni manifest:

Controlla due volte il nome del pacchetto: 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" />

Aggiungi le seguenti autorizzazioni:

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

Le seguenti autorizzazioni sono facoltative e non obbligatorie se visualizzi solo una mappa. Cerca di non usarli.

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

Passaggio 7. Includere il frammento di mappa nel layout:

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

Se il tuo rilascio alle versioni 2.x di Android è necessario aggiungere il supporto nella tua attività:

import android.support.v4.app.FragmentActivity;

Per la mappa: le voci per lavorare includono

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

nel layout dell'attività (ad esempio LinearLayout).

Nel mio caso devo pulire il progetto ogni volta che cambio qualcosa nel layout. Sembra essere un bug.

Passaggio 8: utilizzare Eclipse - Project - Clean.

Godere!


sto seguendo i tuoi passi ma errore in api key, qualche soluzione?
Hemantvc

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

16

Devi utilizzare il progetto della libreria che si trova in: ANDROID-SDK-DIRECTORY / extras / google / google_play_services / libproject

Questo risolverà il tuo primo problema.

Non sono sicuro del tuo secondo, ma potrebbe essere un effetto collaterale del primo. Sto ancora cercando di far funzionare la mappa nella mia app :)


Ho copiato extra / google / google_play_services / libproject / libs / google-play-services.jar in MY_PROJECT / libs.
Rusfearuth

Non è abbastanza buono. È necessario utilizzare l'intero progetto della libreria, poiché include molte risorse. In Eclipse, puoi importare un nuovo progetto Android e puntarlo semplicemente alla directory libproject. Quindi nelle proprietà del tuo progetto, aggiungi un riferimento ad esso.
Scott Kennedy

Non uso Eclipse (uso Idea)
Rusfearuth

Non sono sicuro di come funzionino i progetti di libreria in Idea, ma blogs.jetbrains.com/idea/2010/09/… dovrebbe avere queste informazioni.
Scott Kennedy

17
Ho scoperto perché non ha funzionato. Ho attivato Google Map API v2 invece del servizio Google Map Android API v2. = (Vergogna su di me ...
Rusfearuth

5

Oggi ho dovuto affrontare questo problema. Ho usato Android Studio 2.1.3, Windows 10. Durante il debug funziona bene, ma se aggiorno alla modalità di rilascio non funziona. Ho cancellato tutte le condizioni di proguard, aggiornato, ma questa non era la soluzione.

La soluzione è correlata alla struttura del progetto. Il file google_maps_api.xml era diverso tra app \ src \ debug \ res e app \ src \ release \ res. Ho fatto copia incolla manuale dal debug alla cartella di rilascio.

Ora funziona.


4

Ho seguito la maggior parte, se non tutti, i suggerimenti di Gunnar Bernstein sopra menzionati e ancora non ha funzionato. Tuttavia, ha iniziato a funzionare dopo che ho seguito i suoi suggerimenti E quanto segue:

  1. Ho creato una nuova MapActivity utilizzando l'elenco di opzioni di clic con il tasto destro di Android Studio: Nuovo -> Google -> Attività di Google Maps

  2. Ho quindi aperto il file google_maps_api.xml che viene automaticamente generato e utilizzato il collegamento dichiarato per creare una nuova API KEY. Ho eseguito tutti i passaggi e ho salvato la mia nuova chiave nel progetto corrente. Ho quindi rimosso la mia vecchia API KEY registrata poiché non era più necessaria.

  3. Sotto il file Manifest ho sostituito il vecchio valore API KEY con il collegamento alla stringa creato da questo nuovo file XML: android:value="@string/google_maps_key", invece di indicare direttamente la KEY.

  4. Infine, rimuovi la nuova MapActivity, ma mantieni il file xml creato in quel processo.

Nota: creando l'API KEY in questo modo la colonna Restrizioni, sotto Credenziali, ora indicava "App Android". In precedenza, quando non funzionava, la colonna indicava "App Android, 1 API" o qualcosa di simile. Non so se questo fa la differenza o no. Nota: no, significa semplicemente che non ho un'API specifica selezionata per questa chiave API (Console -> Chiave API -> Restrizioni chiave -> Restrizioni API).

Nota: sembra il tag dei metadati nel file manifest:

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

è stato sostituito da:

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

Immagino che sia possibile utilizzare entrambi, ma è meglio utilizzare quest'ultimo dall'inizio.

Nota: il valore dichiarato, nel file build.gradle, in android -> defaultConfig -> applicationId deve corrispondere al testo del nome del pacchetto nella pagina Credentials.


Questo è esattamente quello che è successo a me e questa soluzione ha risolto l'avviso dalla console. In qualche modo la build ionica lo ha cambiato.
astronauta

Dopo aver cercato 8 ore, guardo indietro e applico questa soluzione. Solved!!!
meyasir

3

Basta aggiungere questo nel tuo file manifest:

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

Per esempio...

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

E per favore aggiorna la tua libreria del servizio Google Play ... Vai su Finestra -> Gestione SDK Android-> Aggiorna servizio Google Play ... installato .. elimina quello vecchio e mantieni questo. Prendi questo da ANDROID-SDK-DIRECTORY / extras / google / google_play_services /

Grazie .. si prega di votare


3

Ho risolto questo errore controllando il nome del pacchetto nel manifest e nell'app build.gradle.

In manifesto:

Sto usando un nome di pacchetto come:

com.app.triapp

In app build.gradle:

 defaultConfig {

        applicationId "com.app.live"
    }

Dopo aver cambiato com.app.triappin build.gradle, ho risolto il mio problema.


1
Molte grazie. Risparmi la mia tonnellata di tempo.
YeeKhin

1
Eccellente fratello. Ho tutto OK, invece di questo
Mubashar Javed

2

Sto migrando dalla V1 alla V2 di Google Maps. Ho riscontrato questo errore tentando di eseguire l'app tramite Eclipse. La causa principale per me era l'utilizzo del mio keystore del certificato di rilascio anziché del keystore di debug di Android, che è quello che viene utilizzato quando lo esegui tramite Eclipse. Il seguente comando (OSX / Linux) ti darà la chiave SHA1 del keystore di debug:

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

Se invece stai usando Windows 7, dovresti usare questo comando:

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

Probabilmente è meglio disinstallare completamente l'app dal dispositivo prima di provare con una nuova chiave poiché Android memorizza nella cache le credenziali di sicurezza.


1

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

Anche A ha riscontrato questo errore, è necessario: File -> import -> Existing Android Code Into Workspace -> Browse -> Android sdks -> extras -> google -> google_play_services -> lib_project -> google_play_services_lib e OK. Controlla il progetto e Fine.

Il progetto va a Package Explorer. Ora vai al tuo progetto (con errore) -> proprietà -> Android e in Libreria fai clic su Aggiungi ... google_play_services_lib dovrebbe essere lì! aggiungi e riprova :)


1

Ho avuto lo stesso problema ma si è scoperto che era perché ho creato due chiavi API della mappa diverse con la stessa impronta digitale SHA-1 con un nome del pacchetto quasi simile com.bla.blae l'altro com.bla.bla.something.


0

Ho avuto lo stesso identico problema e avevo solo bisogno di impostare l'SDK per il progetto di libreria di MapsApiV2 su Android 2.3.3 (API lvl 10)


Non ricordo questa roba
Informatic0re

0

Ho avuto lo stesso problema. Dopo circa due ore di googling, tentativi, rigenerazione della chiave API molte volte, ecc. Ho scoperto di aver abilitato il servizio sbagliato nella console APis di Google. Ho abilitato il servizio API di Google Maps v2 , ma per le app Android devi utilizzare l' API Android di Google Maps v2 . Dopo aver abilitato il servizio giusto, tutto ha iniziato a funzionare.


0

IL TUO ECLIPSE FORSE HA CAMBIATO LA CHIAVE SHA1, quindi devi rigenerare la tua chiave google con la nuova chiave SHA1 qui: https://console.developers.google.com/project/watchful-net-796/apiui/credential Dopodiché, copia la nuova chiave in manifest e ricarica questa pagina google alcune volte, e la tua chiave verrà aggiornata, ricostruisci il tuo progetto, funzionerà. P / S: Per il mio errore, ho eliminato la cartella .android in modo da eclipse regen SHA1.


0

Ho seguito lo stesso passaggio fornito in Google Doc ma ho ricevuto lo stesso errore. Successivamente mi sono reso conto che stavo firmando la mia app con il mio app.keystore e la chiave SHA che stavo usando per generare la chiave API era quella di debug.

Quindi ho semplicemente rimosso il signingConfig signingConfig.genericdabuild.gradle file e la mia mappa ha iniziato a funzionare bene.

Spero che questo aiuti qualcuno.


0

Ho affrontato lo stesso problema.

Se hai rilasciato un'API per la tua versione di rilascio dell'applicazione. Quindi quell'API funzionerà solo per la versione di rilascio, non per la versione di debug. Quindi assicurati di utilizzare la versione di rilascio nel telefono o nell'emulatore.


0

Per me, tutto funzionava sia in un emulatore che su un dispositivo fisico.

Tuttavia, ha smesso di funzionare per me quando ho configurato una seconda macchina per eseguire il debug della stessa app in un emulatore con un livello API più recente.

Non mi ero accorto che l' impronta digitale di quella macchina fosse cambiata. Dopo aver visto il log degli errori di autenticazione fallita nel Device Log, ho confrontato attentamente l'impronta digitale nella mia Console per gli sviluppatori di Google con quella nel messaggio di errore. È stato allora che ho visto la differenza. Dopo aver aggiunto la nuova impronta digitale alla Console per gli sviluppatori (in combinazione con il nome del pacchetto) la mia app ha iniziato a funzionare come previsto nell'emulatore sul nuovo sistema.

Quindi, se imposti un nuovo sistema, controlla di nuovo le tue impronte digitali!


0
  • Assicurati che Maps SDK for Androidsia abilitato nella console API.
  • Inoltre potrebbe essere necessario aggiungere il nome del pacchetto e l'impronta digitale del certificato di firma SHA-1 per limitare l'utilizzo affinché la chiave sia completamente abilitata.

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.