将google-play-services lib导入Intellij IDEA 12(和13)

Mar*_*ini 37 android intellij-idea actionbarsherlock google-play-services

我想将Google Play服务库导入(并使用)到现有的Android项目中,但我正在努力解决必须存在的依赖问题.

谷歌编写的所有文档都基于Eclipse.我们使用IntelliJ IDEA.

我知道的事情:

  • 我知道如何在IntelliJ中导入模块,库,添加依赖项等.
  • 我也知道,根据Google的入门指南,您必须将google-play-services-lib添加到(Eclipse)中作为项目(通过将现有代码导入工作区),并且您可以在IntelliJ中执行此操作通过从现有代码添加新模块.这是相同的程序,不同的名称.
  • 我也理解订单和导出选项卡在Eclipse中的功能(IntelliJ也可以).

我做过的事情:

  • 我将google-play-services_lib文件夹(从安全性)复制到Android SDK到我的项目根目录.所以我有/ myprj和/ google-play-services_lib在同一级别(我也有/ facebooksdk和/ actionbarsherlock在同一级别)并继续进行"导入模块"(来自现有源).然后点击下一个下一个......(它有效,它被识别).

项目结构看起来像这样(名称故意模糊):

项目结构

  • 这正确添加了一个模块(如上面的屏幕截图所示).现在我需要添加依赖项,以便我的主项目知道这一点.我转到我的模块并在列表中,选择我的主模块,然后选择依赖项选项卡.我可以看到一些库(Joda时间,android-query,gson等)和两个模块:FacebookSDKactionbarsherlock.到现在为止还挺好.这就是事情变得怪异的时候.

我试图添加的依赖关系.

注意:在大多数情况下,我尝试检查并取消选中导出复选框,并尝试同时将其添加到sherlockbar模块,仅用于测试.我知道这些是很多组合,但是哦.

1)添加一个Jar或目录(知道这是错的,我试过).并指向google play module/libs中的.jar,名为:google-play-services.jar.

2)添加一个(然后将其添加到项目中)

3)添加模块依赖项(选择主项目时).这会显示一个像这样的弹出窗口:

添加依赖

问题

即使我可以引用一个PlusClient并获得正确的导入,当我尝试在我的布局xml中添加一个SignInButton时,我收到一个错误.

粘贴整个XML布局是没有意义的,因为它没有任何奇怪的东西,它只是一个带有一些textview的RelativeLayout.我像这样添加了g +按钮:

  <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" />
Run Code Online (Sandbox Code Playgroud)

就像谷歌说的那样.

可能出现问题的第一个迹象是IntelliJ警告您元素"在这里无效",但我认为这是视觉设计师的限制而不是真正的问题.

但是,当我运行该项目时,我得到了这个:

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
Run Code Online (Sandbox Code Playgroud)

以下是引起我注意的一句话:

引起:java.lang.NoClassDefFoundError:com.google.android.gms.R $ drawable

下面的下一个例外是:

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
Run Code Online (Sandbox Code Playgroud)

如果我从布局中删除代码,它可以工作.

我的想法是,这与Android处理R(资源)的方式有关,因此它可能无法找到按钮的资源.

有没有人设法使用:Intellij Idea(12+)与ActionbarSherlock和Google+图书馆?

如果是这样,怎么样?:)

Mar*_*ini 96

由于历史原因,我将重现我所做的,取自这里.非常感谢@Hesam找到了它.我将投票结束整个问题.

注意:快捷方式适用于OS X和Intellij 12和13.

确保您拥有最新的SDK/ADT工具和播放服务.它们时不时地变化,通常不会向后兼容.

更新我不得不再次这样做,所以这是我所做的精致版本.

您需要有一个副本(而不是直接从SDK文件夹中使用它),因为如果Google更新它,当您更新SDK时会出现问题,保留副本会更安全(虽然因为您将拥有更复杂的内容)在新版本发布时手动更新).我发现最好决定何时更新,而不是惊讶于神秘的编译错误.

考虑到这一点,将库与项目一起复制.你应该有一个看起来像这样的文件夹结构:

/something/yourmainmodule/

/something/any_other_module/

/something/modules.xml

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

图书馆位于

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

ANDROID-SDK是您下载SDK时存储SDK的任何位置.谷歌时不时地改变它,所以只要找到它,它就会存在.

复制整个文件夹,以便您的项目现在如下所示:

/something/yourmainmodule/

/something/any_other_module/

/something/google-play-services_lib/< - 这是新的一个

/something/modules.xml

/something/README.md

好的,现在让我们以正确的方式将它导入IntelliJ-IDEA:

1)从项目面板()中选择项目/主模块,⌘ 1然后单击⌘ ↓以打开项目结构窗口或只执行文件 - >项目结构.

2)从左侧面板中选择Modules,然后按+按钮(或⌘ N),然后选择" 导入模块 "并导航到google-play-services_lib您刚刚复制到项目模块文件夹旁边的那个.(/something/).

该向导将询问一系列问题,只需点击下一步,默认即可,但阅读正在发生的事情,了解正在发生的事情,这是Java,Android和Intellij的核心概念.如果您不知道每个对话框的内容(或为什么有些可能为空),请进行实验.

完成后,Google Play项目将与项目一起添加到模块中.

请勿关闭此窗口(如果您这样做,请再次打开).

3)仍然在模块中,选择你的项目/模块,然后从右侧面板选择" Dependencies "(它是一个标签),最后点击底部的+按钮(⌘ N如果你在此标签中有焦点,它将起作用),然后从弹出窗口选择" 3 Module dependencies ... "并选择您在上一步中添加的"google-play-services_lib".应该在那里.如果不是,则表示您未在步骤2中添加模块.

4)最后,再次单击+按钮(或⌘ N),但这次选择" 1个罐子或目录...... ",导航到上述路径的"/ libs"文件夹并选择"google-play-services.jar".

5)单击"确定"并关闭项目结构窗口.

如果你这样做,你的主模块应该有一个如下依赖:

依赖

还要确保在"项目结构"窗口的" FACETS"选项卡中,Google Play服务已选中"库模块".这是一个图书馆模块.

注意:确保您没有在"库"(模块下的左侧面板)中添加"google-play-services_lib"项目作为库.如果有,您可以访问" 图书馆并将其删除.Google Play Library不应出现在图书馆中.

信用:此文本来自此StackOverflow答案

  • 嘿,更新:如果不选择Eclipse"外部模型",我选择"从源代码创建"然后一切都很好.感谢您对上述OP的回答. (3认同)
  • 这是一个非常有用的答案,我希望我能不止一次地赞成它.谢谢! (3认同)