web-dev-qa-db-fra.com

Échec d'autorisation de Google Maps Android API v2

Mes pas: 

  • a 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 
  • fichier AndroidManifest créé: 

     

        <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 

  • met "google-play-services.jar" aux libs 

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 changé MyActivity à

  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.
89
Rusfearuth

Pas:

  • pour vous assurer que votre appareil dispose des services Google Play APK
  • installer le service Google Play rev. plus de 2

enter image description here

  • créer un projet sur https://code.google.com/apis/console/
  • activer "Google Maps Android API v2" enter image description here
  • pour enregistrer SHA1 dans le projet (NOW, VOUS AVEZ BESOIN D'ÉCRIRE SHA1; votre.app.package.name) sur la console des API et obtenez l'API KEY
  • copier le répertoire Android_SDK_DIR/extras/google/google_play_services/libproject/google-play-services_lib à la racine de votre projet
  • ajouter la ligne suivante à YOUR_PROJECT/project.properties

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

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

99
Rusfearuth

Consultez également cet article: Google Map pour Android Api V2 Exemple de code ne fonctionne pas , si vous êtes tout à fait sûr d'avoir suivi la bonne procédure, suivez la deuxième réponse, l'authentification est mise en cache quelque part, essayez de désinstaller manuellement l'application (comme vous faites avec une application normale) puis "Exécuter" à nouveau le projet

34
adelriosantiago

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

Étape 1: demandez votre clé API  

Si vous ne connaissez pas bien la console API Google, lisez la très bonne réponse de Rusfearuth ci-dessus.

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

Sur une machine Windows, accédez à votre répertoire utilisateur à l'aide d'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

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

Vous combinez cela et vérifiez cela avec vos paramètres dans la console de l'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. Méta-données manifestes

Vérifiez si les métadonné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 manifestes:

Vous avez besoin de cette entrée car l'API de carte nécessite un support graphique:

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

Ne vous inquiétez pas, 99,7% des appareils le supportent.

Étape 5. Bibliothèque du manifeste:

Ajoutez la librairie 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 manifestes:

Vérifiez le nom du paquet 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 requises 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 votre version des versions 2.x Android, vous devez ajouter un support à votre activité:

import Android.support.v4.app.FragmentActivity;

Pour la carte: les entrées à travailler incluent

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

dans votre présentation d'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!

19
Gunnar Bernstein

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

Cela résoudra votre premier problème.

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

16
Scott Kennedy

Aujourd'hui, j'ai fait face à 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 de publication, cela ne fonctionne pas. J'ai effacé toutes les conditions de proguard, mis à jour, mais ce n'était pas une 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 débogage au dossier de publication. 

Maintenant ça marche. 

5
Yaya

J'ai suivi la plupart des suggestions de Gunnar Bernstein mentionnées ci-dessus, sinon toutes, et cela n'a toujours pas fonctionné. Cependant, cela a commencé à fonctionner après que j'ai suivi ses suggestions ET les suivantes:

  1. J'ai créé une nouvelle MapActivity en utilisant le clic droit de la souris dans la liste d'options de Android Studio: Nouveau -> Google -> Activité de Google Maps

  2. J'ai ensuite ouvert le fichier google_maps_api.xml qui générait automatiquement Est généré et utilise le lien indiqué pour créer une nouvelle clé API. J'ai effectué toutes les étapes et enregistré ma nouvelle clé dans le cadre de mon projet actuel. J'ai ensuite retiré mon ancienne API KEY 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 String créé par ce nouveau fichier XML: Android:value="@string/google_maps_key ", au lieu d'indiquer directement KEY

  4. Enfin, supprimez la nouvelle MapActivity, mais conservez le fichier xml créé Créé dans ce processus.

Remarque: En créant la clé API de cette manière, la colonne Restrictions, sous Informations d'identification, indique désormais "Applications Android". Auparavant, lorsque 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 pas.Remarque: Non, cela signifie simplement que je n'ai pas d'API spécifique sélectionnée pour cette clé d'API (Console -> Clé d'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"

Je suppose que les deux peuvent être utilisés, mais il vaut mieux utiliser ce dernier dès le début.

Remarque: La valeur indiquée dans le fichier build.gradle sous Android -> defaultConfig -> applicationId doit correspondre au texte Package name de la page Credentials.

4
goldenmaza

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 veuillez mettre à jour votre librairie de Google Play ... Allez dans Fenêtre -> Gestionnaire de sdk Android-> mettre à jour le service de Google Play ... installez-le ... supprimez l'ancien et conservez-le Prenez ceci sur Android-SDK-DIRECTORY/extras/google/google_play_services /

Merci..Veuillez voter

3
Mitul Goti

J'ai résolu cette erreur en vérifiant le nom de paquet dans manifest et app build.gradle.

En manifeste:

J'utilise un nom de package en tant que:

com.app.triapp

Dans l'application build.gradle:

 defaultConfig {

        applicationId "com.app.live"
    }

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

3
Stephen

Je migre de V1 à V2 de Google Maps. Je commençais à avoir cet échec en essayant de lancer l'application via Eclipse. La cause fondamentale pour moi était d'utiliser le fichier de clés de mon certificat de version plutôt que celui de débogage Android, qui est utilisé lorsque vous l'exécutez via Eclipse. La commande suivante (OSX/Linux) vous donnera la clé SHA1 du magasin de clés de débogage:

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

Si vous utilisez plutôt Windows 7, utilisez la commande suivante:

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 d'identification de sécurité. 

2
Chris Knight

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

1
Zamrony P. Juhara

"Java.lang.NoClassDefFoundError: com.google.Android.gms.R $ styleable"

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

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

1
edwell

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

Si vous avez émis une API pour votre version finale de l'application ..__, elle ne fonctionnera que pour la version finale, pas pour la version de débogage . Assurez-vous donc que vous utilisez la version finale dans votre téléphone ou votre émulateur.

0
Salman Saleh

Pour moi, tout fonctionnait à la fois dans un émulateur et sur un périphérique 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 les empreintes digitales de cette machine avaient changé. Après avoir consulté le journal des erreurs d’échec d’authentification dans le journal des périphériques, j’ai comparé étroitement l’empreinte digitale de la console développeur de Google avec celle du message d’erreur. C'est à ce moment-là que j'ai vu la différence. Après avoir ajouté la nouvelle empreinte digitale à la console développeur (en combinaison avec le nom du package), mon application a commencé à fonctionner comme prévu dans l'émulateur du nouveau système. 

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

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

0
Informatic0re

J'ai suivi la même étape fournie dans le document de Google mais j'ai eu 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é d'API était celle de débogage. 

J'ai donc simplement supprimé le fichier signingConfig signingConfig.generic du fichier build.gradle et ma carte a commencé à fonctionner correctement.

J'espère que ça aide quelqu'un.

0
SKP

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

0
Nino Stella

VOTRE Eclipse PEUT CHANGER DE CLE SHA1. Vous devez donc régénérer votre clé Google avec la nouvelle clé SHA1 ici: https://console.developers.google.com/project/watchful-net-796/apiui/credential Après cela, 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, je dossier supprimé .Android donc Eclipse regen SHA1.

0
nobjta_9x_tq