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:
Choses que j'ai faites:
La structure du projet ressemble à ceci (nom intentionnellement flou):
[~ # ~] 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:
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? :)
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:
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