将 google-play-services 库导入 Intellij IDEA 12(和 13) [英] Importing google-play-services lib into Intellij IDEA 12 (and 13)

查看:30
本文介绍了将 google-play-services 库导入 Intellij IDEA 12(和 13)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

我知道的事情:

  • 我知道如何在 IntelliJ 中导入模块、库、添加依赖项等.
  • 我也知道根据 当我尝试添加

    I'd like to import (and use) the Google Play Services library into an existing Android project, but I am struggling with what must be a dependency problem.

    All documentation written by google is based upon Eclipse. We use IntelliJ IDEA.

    Things I know:

    • I know how to import Modules, Libraries, add Dependencies, etc. in IntelliJ.
    • I also know that according to the getting started guide at Google, you have to add the google-play-services-lib into (Eclipse) as a project (by importing existing code into the workspace), and that you can do this in IntelliJ by adding a new module from existing code. It's the same procedure, different name.
    • I also understand what the Order and Export tab does in Eclipse (IntelliJ does it too).

    Things I've done:

    • I copied (for safety) the google-play-services_lib folder from the Android SDK to my project root. So I have /myprj and /google-play-services_lib at the same level (I also have /facebooksdk and /actionbarsherlock at the same level) and proceeded to "Import Module" (from existing source). Then clicked next next next… (it worked, it was recognized).

    The project structure looks like this (name intentionally blurred):

    • This correctly added a module (as you can see in the above screenshot). Now I need to add the dependency so my main project knows about this. I go to my modules and in the list, select my main module and then dependencies tab. I can see a few libraries (Joda time, android-query, gson, etc.) and two modules: FacebookSDK and actionbarsherlock. So far so good. And this is when things get weird.

    Dependencies I've tried to add.

    NOTE: In most cases I tried checking and unchecking the export checkbox and also tried adding this to the sherlockbar module at the same time, just for testing. I know these are a lot of combinations, but oh well.

    1) Add a Jar or directory (knowing this was wrong, I tried). and pointed to the .jar that is inside the google play module /libs, named: google-play-services.jar.

    2) Add a Library (and then adding it to the project(s))

    3) Add the Module Dependency, (while having my main project selected). This shows you a pop-up like this:

    PROBLEM

    Even tho I can reference a PlusClient and I get the right imports, when I try to add a SignInButton in my layout xml, I get an error.

    There's no point in pasting the whole XML Layout because it doesn't have anything strange, it's just a RelativeLayout with a few textviews. I added the g+ button like this:

      <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" />
    

    Just like Google says.

    The first sign that something may be out of order is the fact that IntelliJ warnings you that the element is "not valid here", but I assume that's a limitation of the visual designer rather than a real problem.

    However, when I run the project, I get this:

    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
    

    Here is the line that gets my attention:

    Caused by: java.lang.NoClassDefFoundError: com.google.android.gms.R$drawable

    The next exception below is:

    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
    

    If I remove the code from the Layout, it works.

    My idea is that this has to do with the way Android handles the R(esources) and therefore it may not be finding the resource for the button.

    Has anybody managed to use: Intellij Idea (12+) with ActionbarSherlock and Google+ Library?

    If so, how? :)

    解决方案

    For historical reasons, I'm going to reproduce what I did, taken from here. Many thanks to @Hesam who found it. I will vote to close the whole question.

    Note: the shortcuts are for OS X and Intellij 12 and 13.

    Make sure you have the latest SDK/ADT Tools and the play services. They change every now and then and are usually not backwards compatible.

    UPDATE I had to do this again, so this is the polished version of what I did.

    You need to have a copy (as opposed to using it directly from the SDK folder), because if Google updates it, things are going to break when you update your SDK, it's safer to keep a copy (albeit more tedious because you will have to manually update when a new version comes out). I found out that it's better to decide when to update than to be surprised with cryptic compilation errors.

    With that in mind, copy the library alongside your project. You should have a folder structure that looks like:

    /something/yourmainmodule/

    /something/any_other_module/

    /something/modules.xml

    /something/README.md (if you use github) :)

    The library is located in

    "ANDROID-SDK"/extras/google/google_play_services/libproject/google-play-services_lib

    ANDROID-SDK is wherever you stored the SDK when you downloaded it. Google changes this every now and then, so just find it, it will be there.

    Copy that entire folder so your project now looks like this:

    /something/yourmainmodule/

    /something/any_other_module/

    /something/google-play-services_lib/ <-- THIS IS THE NEW ONE

    /something/modules.xml

    /something/README.md

    Good, now let's import it to IntelliJ-IDEA the right way:

    1) Select your project/main module from project panel (⌘ 1) and hit ⌘ ↓ in order to open project structure window or just do File -> Project Structure.

    2) Select Modules from left panel, then hit + button (or ⌘ N) then select "import module" and navigate to the google-play-services_lib that you just copied next to your project's module folder. (/something/).

    The wizard will ask a series of questions, just hit next, defaults are fine, but read what's going on, understand what's happening, this is a core concept in Java, Android and Intellij. Experiment if you don't know what each dialog is saying (or why some may be empty).

    After you're done, the google play Project will be added to Modules alongside with your project.

    Don't close this window (or open it again if you did).

    3) Still in the modules, select your project/module, then select "Dependencies" from right panel (it's a tab) and finally Click + button at the bottom (or ⌘ N which will work if you have the focus in this tab), then from the popup chose "3 Module dependencies..." and select "google-play-services_lib", which you added in the previous step. It should be there. If it's not, you didn't add the module in step 2.

    4) Finally, Click + button again (or ⌘ N) but this time select "1 jars or directories...", navigate to the "/libs" folder of the above path and select "google-play-services.jar".

    5) Click ok and close project structure window.

    If you did this, your main module should have a dependency that looks like this:

    Also make sure that in the Project Structure window, FACETS Tab, the Google Play Services has the "Library Module" checked. It is a library module.

    Note: Make sure you have not added "google-play-services_lib" project as library in "Libraries" (left panel under Modules). If you have, you can go to "Libraries and simply remove it. Google Play Library Should Not Appear In Libraries.

    Credit: this text comes from this StackOverflow answer

    这篇关于将 google-play-services 库导入 Intellij IDEA 12(和 13)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆