Échec de l'autorisation de l'API Google Maps Android v2

95

Mes pas:

  • obtenu le code SHA1 de debug.keystore
  • créer une application dans la console google apis
  • activé google map api v2
  • entrée SHA1; my.package.name
  • obtenir la clé API
  • a créé le fichier 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>
    
  • mise en page créée

  • mettre "google-play-services.jar" dans les bibliothèques

Après la compilation, j'ai 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)

Après cela, j'ai changé la mise en page pour:

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

et a changé MyActivity en

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

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

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

En conséquence, l'application a été lancée, mais je n'ai pas vu la carte.

Journal de la console:

ERROR/Google Maps Android API(10369): Authorization failure.
Rusfearuth
la source
1
OMG! J'ai toujours eu la même classe d'erreur R $ stylable introuvable. Maintenant, j'ai changé mon code pour votre manière programmatique d'implémenter le MapFragment et cela fonctionne! Merci! Mais vous devez créer votre clé comme décrit ci-dessous
Informatic0re

Réponses:

103

Étapes :

  • pour s'assurer que l'appareil dispose des services APK de Google Play
  • pour installer le service Google Play rev. plus de 2

entrez la description de l'image ici

  • pour créer un projet sur https://code.google.com/apis/console/
  • pour activer "Google Maps Android API v2" entrez la description de l'image ici
  • pour enregistrer SHA1 dans le projet ( MAINTENANT, VOUS DEVEZ ÉCRIRE SHA1; your.app.package.name ) sur la console API et obtenir la clé API
  • pour copier le répertoire ANDROID_SDK_DIR / extras / google / google_play_services / libproject / google-play-services_lib à la racine de votre projet
  • pour ajouter la ligne suivante au YOUR_PROJECT / project.properties

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

  • pour ajouter les lignes suivantes au YOUR_PROJECT/proguard-project.txt

.

-keep class * extends java.util.ListResourceBundle {

   protected Object[][] getContents();

}

Vous êtes maintenant prêt à créer votre propre application Google Map à l'aide des API Google Map V2 pour Android.

Si vous créez une application avec min SDK = 8, veuillez utiliser la bibliothèque de support Android v4 + SupportMapFragment au lieu de MapFragment.

Rusfearuth
la source
Ces instructions n'ont pas fait tout le travail. J'avais besoin de copier proguard.cfg à partir de l'exemple d'application de l'API Maps. Ce n'est qu'alors que cela a commencé à fonctionner.
Yoel Gluschnaider
De plus, j'ai remarqué que l'algorithme de signature DOIT être SHA1withRSA et NON SHA256withRSA (la valeur par défaut créée par eclipse pour la clé de débogage).
Yoel Gluschnaider
1
Merci! to enable "Google Maps Android API v2" -step a résolu mon problème.
Johan
1
@YoelGluschnaider: Comment puis-je changer l'algorithme par défaut de SHA256withRSA à SHA1withRSA?
Santhosh
Je vous remercie! J'ai été sauvé par votre idée d'utiliser SupportMapFragment.
Ilya Kogan
35

Vérifiez également cet article: Google Map Android Api V2 Sample Code ne fonctionne pas , si vous êtes complètement sûr d'avoir suivi les bonnes étapes, suivez la deuxième réponse, l'authentification est mise en cache quelque part, essayez de désinstaller l'application manuellement (comme vous le faites avec un application normale) puis "Exécuter" à nouveau le projet

adelriosantiago
la source
6
Je ne peux pas croire que cela a fonctionné. Merci @Alejandro del Rio :)
phil
Je parie que, tout comme moi, 90% des gens ici veulent vraiment cette réponse et non celle sélectionnée (bien que utile aussi)
Kalisky
Dans mon cas, le cache (?) A été mis à jour pendant que je lisais Stackoverflow avec le message d'erreur d'authentification dans le journal. L'application fonctionnait avec l'écran while, après quelques minutes, la carte était chargée et plus d'erreurs d'authentification. Je suppose qu'une réinstallation l'aurait également fait.
John
2
Pour les futurs lecteurs. Supprimer binet gen. Nettoyez, reconstruisez et les informations d'identification mises en cache sont renouvelées.
George Daramouskas
20

Comme je viens de perdre beaucoup de temps à faire fonctionner l'API, je vais essayer de valider étape par étape l'API Map v2:

Étape 1: demandez votre clé API

Si vous n'êtes pas familier avec la console API Google, lisez la très bonne réponse de Rusfearuth ci-dessus.

Étape 2: Vérifiez votre SHA Hash (dans ce cas, j'utilise la clé de débogage de eclipse):

Sur une machine Windows, accédez à votre répertoire utilisateur via une invite de commande:

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

Vous obtiendrez quelque chose comme:

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

Regardez ensuite le nom de votre package de l'activité de la carte, par exemple com.example.mypackagename

Vous combinez cela et vérifiez cela avec vos paramètres dans la console API Google:

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

où vous obtenez votre clé API:

AZzaSyDhkhNotUseFullKey49ylKD2bw1HM

Étape 3. Manifestez les métadonnées

Vérifiez si les méta-données sont présentes et contiennent la bonne clé. Si vous libérez votre application, vous avez besoin d'une clé différente.

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

Étape 4. Caractéristiques du manifeste:

Vous avez besoin de cette entrée car l'API de la carte nécessite une prise en charge de grapics:

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

Ne vous inquiétez pas, 99,7% des appareils le prennent en charge.

Étape 5. Bibliothèque de manifestes:

Ajoutez la bibliothèque 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.

Étape 6. Autorisations du manifeste:

Vérifiez le nom du package deux fois: 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" />

Ajoutez les autorisations suivantes:

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

Les autorisations suivantes sont facultatives et non obligatoires si vous affichez simplement une carte. Essayez de ne pas les utiliser.

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

Étape 7. Incluez le fragment de carte dans votre mise en page:

<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 vous passez aux versions 2.x d'Android, vous devez ajouter une prise en charge dans votre activité:

import android.support.v4.app.FragmentActivity;

Pour la carte: les entrées pour travailler comprennent

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

dans la mise en page de votre activité (par exemple, LinearLayout).

Dans mon cas, je dois nettoyer le projet à chaque fois que je change quelque chose dans la mise en page. Semble être un bug.

Étape 8: Utilisez Eclipse - Project - Clean.

Prendre plaisir!

Gunnar Bernstein
la source
Je suis vos étapes mais une erreur dans la clé API, une solution?
Hemantvc
1
+1 pour <meta-data android: name = "com.google.android.maps.v2.API_KEY" android: value = "AZzaSyDhkhNotUseFullKey49ylKD2bw1HM" />
The-null-Pointer -
16

Vous devez utiliser le projet de bibliothèque situé à l'adresse: ANDROID-SDK-DIRECTORY / extras / google / google_play_services / libproject

Cela résoudra votre premier problème.

Je ne suis pas sûr de votre deuxième, mais cela peut être un effet secondaire du premier. J'essaie toujours de faire fonctionner la carte dans ma propre application :)

Scott Kennedy
la source
J'ai copié extras / google / google_play_services / libproject / libs / google-play-services.jar dans MY_PROJECT / libs.
Rusfearuth
Ce n'est pas assez bon. Vous devez utiliser l'ensemble du projet de bibliothèque, car il comprend de nombreuses ressources. Dans Eclipse, vous pouvez importer un nouveau projet Android et le pointer simplement vers le répertoire libproject. Ensuite, dans les propriétés de votre propre projet, ajoutez-y une référence.
Scott Kennedy
Je n'utilise pas Eclipse (utilisez Idea)
Rusfearuth
Je ne sais pas comment les projets de bibliothèque fonctionnent dans Idea, mais blogs.jetbrains.com/idea/2010/09/ ... devrait avoir cette information.
Scott Kennedy
17
J'ai trouvé pourquoi cela n'a pas fonctionné. J'ai activé Google Map API v2 au lieu du service Google Map Android API v2. = (Honte à moi ....
Rusfearuth
5

Aujourd'hui, je suis confronté à ce problème. J'ai utilisé Android Studio 2.1.3, Windows 10. Pendant le débogage, cela fonctionne bien, mais si je mets à jour en mode version, cela ne fonctionne pas. J'ai effacé toutes les conditions proguard, mis à jour, mais ce n'était pas la solution.

La solution est liée à la structure du projet. Le fichier google_maps_api.xml était différent entre app \ src \ debug \ res et app \ src \ release \ res. J'ai fait un copier-coller manuel du dossier de débogage au dossier de publication.

Maintenant ça marche.

Yaya
la source
4

J'ai suivi la plupart, sinon la totalité, des suggestions de Gunnar Bernstein mentionnées ci-dessus et cela n'a toujours pas fonctionné. Cependant, cela a commencé à fonctionner après avoir suivi ses suggestions ET ce qui suit:

  1. J'ai créé un nouveau MapActivity en utilisant la liste d'options du clic droit d'Android Studio: Nouveau -> Google -> Activité Google Maps

  2. J'ai ensuite ouvert le fichier google_maps_api.xml qui est automatiquement généré et utilisé le lien indiqué pour créer une nouvelle clé API. J'ai suivi toutes les étapes et enregistré ma nouvelle clé sous mon projet actuel. J'ai ensuite supprimé mon ancienne clé API enregistrée car elle n'était plus nécessaire.

  3. Sous le fichier Manifest, j'ai remplacé l'ancienne valeur API KEY par le raccourci de chaîne créé par ce nouveau fichier XML: android:value="@string/google_maps_key", au lieu d'indiquer directement la KEY.

  4. Enfin, supprimez le nouveau MapActivity, mais conservez le fichier xml qui a été créé dans ce processus.

Remarque: en créant la clé API de cette manière, la colonne Restrictions, sous Identifiants, indique désormais "Applications Android". Auparavant, quand cela ne fonctionnait pas, la colonne indiquait "Applications Android, 1 API" ou quelque chose de similaire. Je ne sais pas si cela fait une différence ou non. Remarque: Non, cela signifie simplement que je n'ai pas d'API spécifique sélectionnée pour cette clé API (Console -> Clé API -> Restrictions de clé -> Restrictions d'API).

Remarque: cela ressemble à la balise meta-data sous le fichier Manifest:

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

a été remplacé par:

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

J'imagine que les deux peuvent être utilisés mais c'est mieux dès le départ d'utiliser ce dernier.

Remarque: La valeur indiquée, dans le fichier build.gradle, sous android -> defaultConfig -> applicationId doit correspondre au texte du nom du package sous la page Credentials.

goldenmaza
la source
C'est exactement ce qui m'est arrivé et cette solution a corrigé l'avertissement de la console. D'une manière ou d'une autre, la construction Ionic l'a changé.
spaceman
Après 8 heures de recherche, je regarde en arrière et j'applique cette solution. Solved!!!
meyasir
3

Ajoutez simplement ceci dans votre fichier manifeste:

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

Par exemple...

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

Et s'il vous plaît mettre à jour votre lib de service google play ... Allez dans Fenêtre -> Gestionnaire de sdk Android-> Mettre à jour le service google play ... installé .. supprimer l'ancien et conserver celui-ci. Prenez ceci de ANDROID-SDK-DIRECTORY / extras / google / google_play_services /

Merci. Merci de voter

Mitul Goti
la source
3

J'ai résolu cette erreur en vérifiant le nom du package dans le manifeste et dans l'application build.gradle.

En manifeste:

J'utilise un nom de package comme:

com.app.triapp

Dans l'application build.gradle:

 defaultConfig {

        applicationId "com.app.live"
    }

Après avoir changé com.app.triappen build.gradle, résolu mon problème.

Steve
la source
1
Merci beaucoup. Vous économisez ma tonne de temps.
YeeKhin
1
Excellent frère. J'ai tout OK, au lieu de celui-ci
Mubashar Javed
2

Je migre de la V1 vers la V2 de Google Maps. J'obtenais cet échec en essayant d'exécuter l'application via Eclipse. La cause principale pour moi était d'utiliser mon keystore de certificat de version plutôt que le keystore de débogage Android, ce qui est utilisé lorsque vous l'exécutez via Eclipse. La commande suivante (OSX / Linux) vous obtiendra la clé SHA1 du keystore de débogage:

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

Si vous utilisez à la place Windows 7, vous utiliserez cette commande:

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

Il est probablement préférable de désinstaller complètement votre application de votre appareil avant d'essayer avec une nouvelle clé, car Android met en cache les informations de sécurité.

Chris Knight
la source
1

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

A eu cette erreur aussi, vous devez: Fichier -> importer -> Code Android existant dans l'espace de travail -> Parcourir -> sdks Android -> extras -> google -> google_play_services -> lib_project -> google_play_services_lib et OK. Vérifiez le projet et terminez.

Le projet va à l'Explorateur de packages. Maintenant, allez dans votre projet (avec erreur) -> propriétés -> Android et dans la bibliothèque cliquez sur Ajouter ... la google_play_services_lib devrait être là! ajoutez et réessayez :)

Edwell
la source
1

J'ai eu le même problème mais il s'est avéré que c'était parce que j'avais créé deux clés API de carte différentes avec la même empreinte digitale SHA-1 avec un nom de package presque similaire com.bla.blaet l'autre com.bla.bla.something.

Zamrony P. Juhara
la source
0

J'ai eu exactement le même problème et j'avais juste besoin de définir le SDK pour le projet de bibliothèque de MapsApiV2 sur Android 2.3.3 (API lvl 10)

Informatic0re
la source
Je ne me souviens pas de ce truc
Informatic0re
0

J'ai eu le même problème. Après environ deux heures de recherche sur Google, de nouvelles tentatives, de régénération de la clé API plusieurs fois, etc., j'ai découvert que j'avais activé le mauvais service dans la console Google APis. J'ai activé le service de l'API Google Maps v2 , mais pour les applications Android, vous devez utiliser l' API Google Maps Android v2 . Après avoir activé le bon service, tout a commencé à fonctionner.

Nino Stella
la source
0

VOTRE ECLIPSE PEUT ÊTRE CHANGÉ DE CLÉ SHA1, vous devez donc regénérer votre clé google avec la nouvelle clé SHA1 ici: https://console.developers.google.com/project/watchful-net-796/apiui/credential Ensuite, copiez la nouvelle clé dans le manifeste et rechargez cette page google quelques fois, et votre clé sera mise à jour, reconstruisez votre projet, cela fonctionnera. P / S: Pour mon erreur, j'ai supprimé le dossier .android afin d'éclipse regen SHA1.

nobjta_9x_tq
la source
0

J'ai suivi la même étape fournie dans le document Google mais j'obtenais la même erreur. Plus tard, j'ai réalisé que je signais mon application avec mon app.keystore et que la clé SHA que j'utilisais pour générer la clé API était celle de débogage.

J'ai donc simplement supprimé le fichier signingConfig signingConfig.genericde by build.gradleet ma carte a commencé à fonctionner correctement.

J'espère que cela aide quelqu'un.

SKP
la source
0

J'ai fait face au même problème.

Si vous avez publié une API pour votre version commerciale de l'application. Ensuite, cette API ne fonctionnera que pour la version finale et non pour la version de débogage. Assurez-vous donc que vous utilisez la version finale de votre téléphone ou de votre émulateur.

Salman Saleh
la source
0

Pour moi, tout fonctionnait à la fois dans un émulateur et sur un appareil physique.

Cependant, cela a cessé de fonctionner pour moi lorsque j'ai configuré une deuxième machine pour déboguer la même application dans un émulateur avec un niveau d'API plus récent.

Je ne savais pas que l' empreinte digitale de cette machine avait changé. Après avoir vu le journal des erreurs d'authentification dans le journal de l'appareil, j'ai étroitement comparé l'empreinte digitale dans ma Google Developer Console avec celle du message d'erreur. C'est là que j'ai vu la différence. Après avoir ajouté la nouvelle empreinte digitale à la Developer Console (en combinaison avec le nom du package), mon application a commencé à fonctionner comme prévu dans l'émulateur sur le nouveau système.

Donc, si vous configurez un nouveau système, vérifiez à nouveau vos empreintes digitales!

DankMemester 'Andrew Servania'
la source
0
  • Assurez-vous que Maps SDK for Androidest activé dans la console API.
  • Vous devrez peut-être également ajouter le nom de votre package et l'empreinte digitale du certificat de signature SHA-1 pour limiter l'utilisation de votre clé afin qu'elle soit entièrement activée.

entrez la description de l'image ici

this.Mitch
la source