我想将Google Play服务库导入(并使用)到现有的Android项目中,但我正在努力应对依赖性问题。
google编写的所有文档都基于Eclipse。我们使用IntelliJ IDEA。
我知道的事情:
我做过的事情:
项目结构如下所示(名称故意模糊):
注意:在大多数情况下,我尝试检查并取消选中导出复选框,并尝试同时将其添加到sherlockbar模块,仅用于测试。我知道这些是很多组合,但是很好。
1)添加一个Jar或目录(知道这是错的,我试过)。并指向google play module / libs中的.jar,名为:google-play-services.jar。
2)添加库(然后将其添加到项目中)
3)添加模块依赖,(选择主项目时)。这会向您显示如下弹出窗口:
即使我可以引用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+图书馆?
如果是这样,怎么样? :)
答案 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)单击“确定”并关闭项目结构窗口。
如果您这样做,您的主模块应具有如下所示的依赖关系:
另外,请确保在“项目结构”窗口的 FACETS 标签中,Google Play服务已选中“图书馆模块”。这是一个图书馆模块。
注意:确保您没有在“库”(模块下的左侧面板)中添加“google-play-services_lib”项目作为库。如果有,您可以访问“图书馆,然后将其删除。 Google Play图书馆不应出现在图书馆。
信用:此文字来自this StackOverflow answer