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

时间:2013-07-31 01:51:23

标签: android intellij-idea actionbarsherlock google-play-services

我想将Google Play服务库导入(并使用)到现有的Android项目中,但我正在努力应对依赖性问题。

google编写的所有文档都基于Eclipse。我们使用IntelliJ IDEA。

我知道的事情:

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

我做过的事情:

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

项目结构如下所示(名称故意模糊):

Project Structure

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

我尝试添加的依赖关系

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

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

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

3)添加模块依赖,(选择主项目时)。这会向您显示如下弹出窗口:

add dependency

问题

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

粘贴整个XML Layout是没有意义的,因为它没有任何奇怪的东西,它只是一个带有一些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" />

就像谷歌说的那样。

可能出现问题的第一个迹象是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

以下是引起我注意的一行:

引起: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

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

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

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

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

1 个答案:

答案 0 :(得分:96)

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

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

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

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

你需要有一个副本(而不是直接从SDK文件夹中使用它),因为如果谷歌更新它,当你更新你的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/&lt; - 这是新的

/something/modules.xml

/something/README.md

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

1)从项目面板中选择您的项目/主模块⌘1)并点击⌘↓以打开项目结构窗口或者只是做文件 - &gt;项目结构。

2)从左侧面板中选择模块,然后按+按钮(或⌘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个jars或目录... ” ,导航到上述路径的“/ libs”文件夹,然后选择“google-play-services.jar”。

5)单击“确定”并关闭项目结构窗口。

如果您这样做,您的主模块应具有如下所示的依赖关系:

Dependencies

另外,请确保在“项目结构”窗口的 FACETS 标签中,Google Play服务已选中“图书馆模块”。这是一个图书馆模块。

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

信用:此文字来自this StackOverflow answer