36

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

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

我知道的事情:

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

我做过的事情:

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

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

项目结构

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

我尝试添加的依赖项

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

1)添加一个Jar或目录(知道这是错误的,我试过了)。并指向 google play 模块 /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" />

就像谷歌说的那样。

可能出现问题的第一个迹象是 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(esources) 的方式有关,因此它可能找不到按钮的资源。

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

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

4

1 回答 1

95

由于历史原因,我将复制我所做的,取自这里。非常感谢找到它的@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 时存储它的位置。谷歌时不时地改变它,所以只要找到它,它就会在那里。

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

/something/yourmainmodule/

/something/any_other_module/

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

/something/modules.xml

/something/README.md

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

1)从项目面板 ( ) 中选择您的项目/主模块⌘ 1并点击⌘ ↓</kbd> in order to open project structure window or just do File -> Project Structure.

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

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

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

不要关闭此窗口(如果您关闭了,也不要再次打开它)。

3)仍然在模块中,选择您的项目/模块,然后从右侧面板(它是一个选项卡)中选择“依赖项” ,最后单击底部的+按钮(或者如果您在此选项卡中有焦点,它将起作用),然后从弹出窗口中选择“ 3 Module dependencies... ”并选择您在上一步中添加的“google-play-services_lib”。它应该在那里。如果不是,则您没有在步骤 2 中添加模块。⌘ N

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

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

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

依赖项

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

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

信用:这段文字来自这个 StackOverflow 答案

于 2013-07-31T18:07:48.923 回答