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

Posted

技术标签:

【中文标题】将 google-play-services 库导入 Intellij IDEA 12(和 13)【英文标题】:Importing google-play-services lib into Intellij IDEA 12 (and 13) 【发布时间】:2013-07-31 09:13:34 【问题描述】:

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

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

我知道的事情:

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

我做过的事情:

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

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

这正确添加了一个模块(如您在上面的屏幕截图中所见)。现在我需要添加 dependency 以便我的主项目知道这一点。我转到我的 modules 并在列表中选择我的主 module,然后选择 dependencies 选项卡。我可以看到一些库(Joda time、android-query、gson 等)和两个模块FacebookSDKactionbarsherlock。到目前为止,一切都很好。这就是事情变得奇怪的时候。

我尝试添加的依赖项

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

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

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

3) 添加Module Dependency,(同时选择我的主项目)。这会显示一个像这样的弹出窗口:

问题

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

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

  <com.google.android.gms.common.SignInButton
    android:id="@+id/sign_in_button"
    android:layout_
    android:layout_
    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 ComponentInfocom.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(esources) 的方式有关,因此它可能找不到按钮的资源。

有人设法使用:Intellij Idea (12+) with ActionbarSherlock 和 Google+ Library?

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

【问题讨论】:

请看:***.com/a/15826818/513413 谢谢!我四处搜索,但大多数帖子都是针对旧版本或 Eclipse。 java.lang.noclassdeffounderror: com.google.android.gms.R$styleable的可能重复 【参考方案1】:

出于历史原因,我将重现我所做的,取自here。非常感谢找到它的@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 时存储它的位置。 Google 会时不时地更改它,所以只要找到它,它就会在那里。

复制整个文件夹,使您的项目现在看起来像这样:

/something/yourmainmodule/

/something/any_other_module/

/something/google-play-services_lib/ 这是新的

/something/modules.xml

/something/README.md

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

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

2) 从左侧面板中选择 Modules,然后点击 + 按钮(或 ⌘ N)然后选择“import module”并导航到google-play-services_lib 您刚刚复制在项目的模块文件夹旁边。 (/something/)。

向导会问一系列问题,直接点击next,默认就可以了,但是看看发生了什么,明白发生了什么,这是Java、Android和Intellij中的一个核心概念。如果您不知道每个对话框在说什么(或者为什么有些可能是空的),请尝试一下。

完成后,google play 项目将与您的项目一起添加到 Modules 中。

不要关闭这个窗口(如果你关闭了,也不要再打开它)。

3) 仍然在 modules 中,选择 your project/module,然后从右侧面板中选择“Dependencies”(这是一个 tab),最后点击底部的 + 按钮(或 ⌘ N 如果你有 focus 这将起作用选项卡),然后从弹出窗口中选择“3 Module dependencies...”并选择您在上一步中添加的“google-play-services_lib”。它应该在那里。如果不是,则说明您没有在第 2 步中添加模块。

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

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

如果你这样做了,你的主模块应该有一个看起来像这样的依赖:

还要确保在“项目结构”窗口的 FACETS 选项卡中,Google Play 服务已选中“库模块”。它是一个库模块。

注意:确保您没有将“google-play-services_lib”项目添加为“库”中的库(左侧面板下的模块)。如果有,您可以转到“Libraries 并简单地将其删除。Google Play Library 不应出现在 Libraries 中

学分:本文来自this *** answer

【讨论】:

嗨@Martin,我在 IntelliJ 12 上按照您的说明进行操作。但是在第 2 步我不能。我选择“导入模块” IntelliJ 提示我选择要导入的项目,我浏览到文件夹并选择 Eclipse“外部模型”,然后是 Next,然后是 Next => Error: nothing to import。通常导入外部项目应该显示一些模块。任何想法? tks @TungMaiLe 我不确定会发生什么。您是否选择了正确的文件夹(.../libproject/google-play-services_lib ???) 嘿,更新:如果我没有选择 Eclipse“外部模型”,而是选择“从源代码创建”,那么一切都很好。感谢您对上述 OP 的回答。 在 IntelliJ 的 google_play_services 模块中,我还必须将 google_play_services.jar 添加为该模块的库,然后选中“导出”复选框 - 这样这个依赖模块就会贡献 jar(其中所有代码都是,模块的其余部分是空的)到我的模块。 这是一个非常有用的答案,我希望我能不止一次地支持它。谢谢!

以上是关于将 google-play-services 库导入 Intellij IDEA 12(和 13)的主要内容,如果未能解决你的问题,请参考以下文章

使用 google-play-services 进行 Proguard

为啥 Localytics 需要 google-play-services:ads?

Google-Play-Services:创建自定义候诊室 UI

导入 google-play-service 库,在此参考 android 旁边显示一个红色 X

Google Play 游戏服务 - 无法登录游戏中心

Google Play 服务在 Android 2.3 Vision API 上崩溃