web-dev-qa-db-fra.com

Importation de google-play-services lib dans Intellij IDEA 12 (et 13)

Je voudrais importer (et utiliser) la bibliothèque des services Google Play dans un projet Android Android), mais je me bats avec ce qui doit être un problème de dépendance.

Toute la documentation écrite par google est basée sur Eclipse. Nous utilisons IntelliJ IDEA.

Ce que je sais:

  • Je sais comment importer des modules, des bibliothèques, ajouter des dépendances, etc. dans IntelliJ.
  • Je sais aussi que selon le guide de démarrage de Google , vous devez ajouter le google-play-services-lib dans (Eclipse) en tant que projet (en important du code existant dans l'espace de travail), et que vous pouvez le faire dans IntelliJ en ajoutant un nouveau module à partir du code existant. C'est la même procédure, un nom différent.
  • Je comprends également ce que fait l'onglet Commande et exportation dans Eclipse (IntelliJ le fait aussi).

Choses que j'ai faites:

  • J'ai copié (par sécurité) le dossier google-play-services_lib du dossier Android SDK vers la racine de mon projet. Donc J'ai/myprj et/google-play-services_lib au même niveau (j'ai aussi/facebooksdk et/actionbarsherlock au même niveau) et je suis passé à "Importer le module" (à partir d'une source existante). Puis j'ai cliqué sur suivant suivant suivant ... (il travaillé, il a été reconnu).

La structure du projet ressemble à ceci (nom intentionnellement flou):

Project Structure

  • Cela a correctement ajouté un module (comme vous pouvez le voir dans la capture d'écran ci-dessus). Maintenant, je dois ajouter la dépendance pour que mon projet principal le sache. Je vais dans mon modules et dans la liste, sélectionnez mon principal module puis dépendances onglet. Je peux voir quelques bibliothèques (Joda time, Android-query, gson, etc.) et deux modules: FacebookSDK et actionbarsherlock . Jusqu'ici tout va bien. Et c'est là que les choses deviennent bizarres.

Dépendances que j'ai essayé d'ajouter .

[~ # ~] note [~ # ~] : Dans la plupart des cas, j'ai essayé de cocher et de décocher la case d'exportation et j'ai également essayé d'ajouter ceci au module sherlockbar en même temps, juste pour les tests. Je sais que ce sont beaucoup de combinaisons, mais bon.

1) Ajoutez un Jar ou un répertoire (sachant que c'était faux, j'ai essayé). et pointé vers le .jar qui se trouve dans le module/libs google play, nommé: google-play-services.jar.

2) Ajouter une bibliothèque (puis l'ajouter au (x) projet (s))

3) Ajoutez la dépendance de module , (tout en ayant mon projet principal sélectionné). Cela vous montre une fenêtre contextuelle comme celle-ci:

add dependency

Problème [~ # ~] [~ # ~]

Même si je peux référencer un PlusClient et que j'obtiens les bonnes importations, lorsque j'essaie d'ajouter un SignInButton dans ma mise en page xml, j'obtiens une erreur.

Il ne sert à rien de coller la mise en page XML entière car elle n'a rien d'étrange, c'est juste une mise en page relative avec quelques vues de texte. J'ai ajouté le bouton g + comme ceci:

  <com.google.Android.gms.common.SignInButton
    Android:id="@+id/sign_in_button"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_below="@+id/logo_login"
    Android:layout_marginBottom="30dip" />

Tout comme Google le dit.

Le premier signe que quelque chose peut être en panne est le fait qu'IntelliJ vous avertit que l'élément n'est "pas valide ici", mais je suppose que c'est une limitation du concepteur visuel plutôt qu'un vrai problème.

Cependant , lorsque j'exécute le projet, j'obtiens ceci:

07-30 17:50:44.854: ERROR/ActivityThread(22324): Failed to inflate
    Android.view.InflateException: Binary XML file line #22: Error inflating class com.google.Android.gms.common.SignInButton
    at Android.view.LayoutInflater.createView(LayoutInflater.Java:606)
    at Android.view.LayoutInflater.createViewFromTag(LayoutInflater.Java:680)
    at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:739)
    at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:742)
    at Android.view.LayoutInflater.inflate(LayoutInflater.Java:489)
    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:251)
    at com.actionbarsherlock.internal.ActionBarSherlockNative.setContentView(ActionBarSherlockNative.Java:134)
    at com.actionbarsherlock.app.SherlockFragmentActivity.setContentView(SherlockFragmentActivity.Java:262)
    at com.myapp.ui.activities.LoginSignupActivity.onCreate(LoginSignupActivity.Java:64)
    at Android.app.Activity.performCreate(Activity.Java:4465)
    at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1049)
    at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2033)
    at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2104)
    at Android.app.ActivityThread.access$600(ActivityThread.Java:132)
    at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1157)
    at Android.os.Handler.dispatchMessage(Handler.Java:99)
    at Android.os.Looper.loop(Looper.Java:137)
    at Android.app.ActivityThread.main(ActivityThread.Java:4575)
    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:789)
    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:556)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: Java.lang.reflect.InvocationTargetException
    at Java.lang.reflect.Constructor.constructNative(Native Method)
    at Java.lang.reflect.Constructor.newInstance(Constructor.Java:417)
    at Android.view.LayoutInflater.createView(LayoutInflater.Java:586)
    ... 24 more
    Caused by: Java.lang.NoClassDefFoundError: com.google.Android.gms.R$drawable
    at com.google.Android.gms.internal.aa.b(Unknown Source)
    at com.google.Android.gms.internal.aa.a(Unknown Source)
    at com.google.Android.gms.common.SignInButton.c(Unknown Source)
    at com.google.Android.gms.common.SignInButton.d(Unknown Source)
    at com.google.Android.gms.common.SignInButton.setStyle(Unknown Source)
    at com.google.Android.gms.common.SignInButton.<init>(Unknown Source)
    at com.google.Android.gms.common.SignInButton.<init>(Unknown Source)
    ... 27 more

Voici la ligne qui retient mon attention:

Causée par: Java.lang.NoClassDefFoundError: com.google.Android.gms.R $ drawable

La prochaine exception ci-dessous est:

07-30 17:50:44.870: ERROR/AndroidRuntime(22324): FATAL EXCEPTION: main
    Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp/com.myapp.ui.activities.LoginSignupActivity}: Android.view.InflateException: Binary XML file line #22: Error inflating class com.google.Android.gms.common.SignInButton
    at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2079)
    at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2104)
    at Android.app.ActivityThread.access$600(ActivityThread.Java:132)
    at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1157)
    at Android.os.Handler.dispatchMessage(Handler.Java:99)
    at Android.os.Looper.loop(Looper.Java:137)
    at Android.app.ActivityThread.main(ActivityThread.Java:4575)
    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:789)
    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:556)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: Android.view.InflateException: Binary XML file line #22: Error inflating class com.google.Android.gms.common.SignInButton
    at Android.view.LayoutInflater.createView(LayoutInflater.Java:606)
    at Android.view.LayoutInflater.createViewFromTag(LayoutInflater.Java:680)
    at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:739)
    at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:742)
    at Android.view.LayoutInflater.inflate(LayoutInflater.Java:489)
    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:251)
    at com.actionbarsherlock.internal.ActionBarSherlockNative.setContentView(ActionBarSherlockNative.Java:134)
    at com.actionbarsherlock.app.SherlockFragmentActivity.setContentView(SherlockFragmentActivity.Java:262)
    at com.myapp.ui.activities.LoginSignupActivity.onCreate(LoginSignupActivity.Java:64)
    at Android.app.Activity.performCreate(Activity.Java:4465)
    at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1049)
    at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2033)
    ... 11 more
    Caused by: Java.lang.reflect.InvocationTargetException
    at Java.lang.reflect.Constructor.constructNative(Native Method)
    at Java.lang.reflect.Constructor.newInstance(Constructor.Java:417)
    at Android.view.LayoutInflater.createView(LayoutInflater.Java:586)
    ... 24 more
    Caused by: Java.lang.NoClassDefFoundError: com.google.Android.gms.R$drawable
    at com.google.Android.gms.internal.aa.b(Unknown Source)
    at com.google.Android.gms.internal.aa.a(Unknown Source)
    at com.google.Android.gms.common.SignInButton.c(Unknown Source)
    at com.google.Android.gms.common.SignInButton.d(Unknown Source)
    at com.google.Android.gms.common.SignInButton.setStyle(Unknown Source)
    at com.google.Android.gms.common.SignInButton.<init>(Unknown Source)
    at com.google.Android.gms.common.SignInButton.<init>(Unknown Source)
    ... 27 more

Si je supprime le code de la mise en page, cela fonctionne.

Mon idée est que cela a à voir avec la façon dont Android gère le R(esources)) et donc il se peut qu'il ne trouve pas la ressource pour le bouton.

Quelqu'un a-t-il réussi à utiliser: Intellij Idea (12+) avec ActionbarSherlock et Google+ Library?

Si c'est le cas, comment? :)

37
Martin Marconcini

Pour des raisons historiques, je vais reproduire ce que j'ai fait, tiré de ici . Un grand merci à @ Hesam qui l'a trouvé. Je voterai pour clore toute la question.

Remarque: les raccourcis sont pour OS X et Intellij 12 et 13.

Assurez-vous que vous disposez des derniers outils SDK/ADT et des services de lecture. Ils changent de temps en temps et ne sont généralement pas rétrocompatibles.

[~ # ~] mise à jour [~ # ~] J'ai dû recommencer, c'est donc la version soignée de ce que j'ai fait.

Vous devez avoir une copie (au lieu de l'utiliser directement à partir du dossier SDK), car si Google le met à jour, les choses vont se casser lorsque vous mettez à jour votre SDK, il est plus sûr de conserver une copie (bien que plus fastidieux car vous aurez pour mettre à jour manuellement lorsqu'une nouvelle version sort). J'ai découvert qu'il valait mieux décider du moment de la mise à jour que d'être surpris par des erreurs de compilation cryptées.

Dans cet esprit, copiez la bibliothèque à côté de votre projet. Vous devriez avoir une structure de dossiers qui ressemble à:

/something/yourmainmodule/

/something/any_other_module/

/something/modules.xml

/something/README.md (if you use github) :)

La bibliothèque est située à

"Android-SDK"/extras/google/google_play_services/libproject/google-play-services_lib

Android-SDK est l'endroit où vous avez stocké le SDK lorsque vous l'avez téléchargé. Google change cela de temps en temps, alors il suffit de le trouver, il sera là.

Copiez tout ce dossier pour que votre projet ressemble maintenant à ceci:

/something/yourmainmodule/

/something/any_other_module/

/something/google-play-services_lib/ <- CECI IS LE NOUVEAU

/something/modules.xml

/something/README.md

Bon, maintenant importons-le dans IntelliJ-IDEA de la bonne façon:

1) Sélectionnez votre projet/module principal dans le panneau de projet (⌘ 1) et appuyez sur ⌘ ↓ afin d'ouvrir la fenêtre de structure du projet ou tout simplement faire Fichier -> Structure du projet.

2) Sélectionnez Modules dans le panneau de gauche, puis appuyez sur le bouton + (ou ⌘ N), puis sélectionnez " module d'importation" et accédez au google-play-services_lib que vous venez de copier à côté du dossier de module de votre projet . (/something/).

L'assistant posera une série de questions, appuyez simplement sur suivant, les valeurs par défaut sont correctes, mais lisez ce qui se passe, comprenez ce qui se passe, ceci est un concept de base en Java, Android et Intellij. Expérimentez si vous ne savez pas ce que dit chaque boîte de dialogue (ni pourquoi certaines peuvent être vides).

Une fois que vous avez terminé, le projet google play sera ajouté à Modules avec votre projet.

Ne fermez pas cette fenêtre (ou ne l'ouvrez pas si vous l'avez fait).

3) Toujours dans les modules, sélectionnez votre projet/module , puis sélectionnez " Dépendances "dans le panneau de droite (c'est un tab) et enfin cliquez sur + bouton en bas (ou ⌘ N qui fonctionnera si vous avez le focus dans cet onglet), puis dans la fenêtre contextuelle choisissez " 3 dépendances de module ..." et sélectionnez "google-play -services_lib ", que vous avez ajouté à l'étape précédente. Ça devrait être là. Si ce n'est pas le cas, vous n'avez pas ajouté le module à l'étape 2.

4) Enfin, Cliquez à nouveau sur le bouton + (ou ⌘ N) mais cette fois, sélectionnez " 1 fichiers ou répertoires ...", accédez au dossier "/ libs" du chemin ci-dessus et sélectionnez "google-play-services.jar".

5) Cliquez sur ok et fermez la fenêtre de structure du projet.

Si vous avez fait cela, votre module principal devrait avoir une dépendance qui ressemble à ceci:

Dependencies

Assurez-vous également que dans la fenêtre Structure du projet, onglet [~ # ~] facettes [~ # ~] , les services Google Play disposent du module "Bibliothèque " vérifié. Il s'agit d'un module de bibliothèque.

Remarque : Assurez-vous que vous n'avez pas ajouté le projet "google-play-services_lib" comme bibliothèque dans "Bibliothèques" (panneau de gauche sous Modules). Si c'est le cas, vous pouvez aller dans " Bibliothèques et simplement le supprimer. La bibliothèque Google Play ne devrait pas apparaître dans les bibliothèques .

Crédit : ce texte vient de cette réponse StackOverflow

96
Martin Marconcini