将google-play-services库导入Intellij IDEA 12(和13)
我想将Google Play服务库导入(并使用)到一个现有的Android项目中,但我正在努力解决一个依赖性问题。
所有由Google编写的文档都基于Eclipse。 我们使用IntelliJ IDEA。
我知道的事情:
- 我知道如何在IntelliJ中导入模块,库,添加依赖等。
- 我也知道,根据Google入门指南 ,您必须将Google-play-services-lib作为项目 (通过将现有代码导入到工作区中)添加到(Eclipse)中,并且您可以在IntelliJ通过从现有的代码添加一个新的模块。 这是相同的程序,不同的名称。
- 我也明白了Order和Export选项卡在Eclipse中的作用(IntelliJ也是这样做的)。
我做的事情:
- 为了安全起见,我将google-play-services_lib文件夹从Android SDK复制到我的项目根目录。 所以我有/ myprj和/ google-play-services_lib在同一级别(我也有/ facebooksdk和/ actionbarsherlock在同一级别),并进入“导入模块”(从现有的来源)。 然后点击下一个下一个…(它的工作,它被认可)。
项目结构看起来像这样(名称故意模糊):
- 这正确地添加了一个模块(如上图所示)。 现在我需要添加依赖,所以我的主要项目知道这一点。 我去我的模块,并在列表中,select我的主要模块 ,然后依赖关系选项卡。 我可以看到几个库(Joda时间,android-query,gson等)和两个模块 : FacebookSDK和actionbarsherlock 。 到现在为止还挺好。 这是当事情变得怪异的时候。
我试图添加的依赖项 。
注 :在大多数情况下,我试图检查和取消选中导出checkbox,并试图同时添加到sherlockbar模块,只是为了testing。 我知道这些是很多组合,但是哦。
1)添加一个jar子或目录(知道这是错的,我试过)。 并指向google play模块/ libs中的.jar,名称为:google-play-services.jar。
2)添加一个库 (然后将其添加到项目中)
3)添加模块依赖项 ,(同时select我的主项目)。 这显示你这样的popup窗口:
问题
即使我可以引用一个PlusClient和我得到正确的导入,当我尝试在我的布局xml中添加一个SignInButton ,我得到一个错误。
粘贴整个XML布局没有任何意义,因为它没有什么奇怪的,只是一个带有几个textview的RelativeLayout。 我添加了像这样的g +button:
<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" />
就像Google所说的。
第一个迹象表明,事情可能是无序的IntelliJ警告你说,这个元素“在这里是无效的”,但我认为这是一个视觉devise师的限制,而不是一个真正的问题。
但是 ,当我运行该项目时,我得到这个:
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)的方式有关,因此可能找不到button的资源。
有没有人设法使用:Intellij Idea(12+)与ActionbarSherlock和Google+ Library?
如果是这样,怎么样? 🙂
由于历史的原因,我将重现我从这里拿走的东西 。 非常感谢@Hesam发现它。 我会投票结束整个问题。
注意 :快捷方式适用于OS X和Intellij 12和13。
确保你有最新的SDK / ADT工具和播放服务。 他们时不时变化,通常不会向后兼容。
更新我不得不这样做,所以这是我所做的抛光版本。
您需要有一个副本(而不是直接从SDK文件夹中使用它),因为如果Google更新它,当您更新SDK时事情将会中断,保留一个副本更安全(尽pipe因为您将会有更多的乏味当新版本出现时手动更新)。 我发现,决定什么时候更新会比编译错误感到惊讶更好。
考虑到这一点,将图书馆复制到您的项目旁边。 你应该有一个像这样的文件夹结构:
/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时存储在哪里的地方。 谷歌现在每隔一段时间就更改一次,所以只要find它,它就会在那里。
复制整个文件夹,使您的项目如下所示:
/something/yourmainmodule/
/something/any_other_module/
/something/google-play-services_lib/
< – 这是新的一个
/something/modules.xml
/something/README.md
好,现在让我们以正确的方式将它导入IntelliJ-IDEA:
1)从项目面板( ⌘1 )中select您的项目/主模块 ,然后点击⌘↓以打开项目结构窗口或者执行文件 – >项目结构。
2)从左侧面板中select模块 ,然后点击+button(或⌘N ),然后select“ 导入模块 ”,然后导航到刚刚复制到项目模块文件夹旁边的google-play-services_lib
。 ( /something/
)。
向导会问一系列的问题,只要点击下一步,默认是好的,但是看看发生了什么,明白发生了什么,这是Java,Android和Intellij的一个核心概念。 如果你不知道每个对话框在说什么(或为什么有些可能是空的),那么试验一下。
完成之后,Google Play项目将与您的项目一起添加到模块中 。
不要closures这个窗口(或者如果你这样做了,再打开它)。
3)仍然在模块中 ,select您的项目/模块 ,然后从右侧面板(这是一个选项卡 ),最后select“ 依赖项 ”,最后点击底部的+button(或⌘N ,如果你有焦点在这个标签) ,然后从popup窗口中select“ 3 Module dependencies … ”并select您在上一步添加的“google-play-services_lib”。 它应该在那里。 如果不是,则在步骤2中不添加模块。
4)最后再次点击+button (或⌘N ),但是这次select“ 1 jars or directories … ”,导航到上面path的“/ libs”文件夹并select“google-play-services.jar” 。
5)点击确定,closures项目结构窗口。
如果你这样做了,你的主模块应该有这样的依赖:
另外,请确保在“项目结构”窗口的“ FACETS”选项卡中,Google Play服务已选中“库模块”。 这是一个图书馆模块。
注意 :确保您没有在“库”(模块下的左侧面板)中添加“google-play-services_lib”项目作为库。 如果你有,你可以去“ 图书馆 ,只是删除它。 谷歌播放图书馆不应该出现在图书馆 。
信用 :这个文本来自这个StackOverflow答案