Импортирование google-play-services lib в Intellij IDEA 12 (и 13)

Я хотел бы импортировать (и использовать) библиотеку Служб Google Play в существующий проект Android, но я борюсь с тем, что должно быть проблемой зависимости.

Вся документация, написанная google, основана на Eclipse. Мы используем IntelliJ IDEA.

Вещи, которые я знаю:

  • Я знаю, как импортировать модули, библиотеки, добавлять зависимости и т.д. в IntelliJ.
  • Я также знаю, что согласно руководству по началу работы в Google, вы должны добавить google-play-services-lib в (Eclipse ) как проект (путем импорта существующего кода в рабочую область), и что вы можете сделать это в IntelliJ, добавив новый модуль из существующего кода. Это та же процедура, другое имя.
  • Я также понимаю, что вкладка "Заказ и экспорт" выполняется в Eclipse (IntelliJ делает это тоже).

Что я сделал:

  • Я скопировал (для безопасности) папку google-play-services_lib из Android SDK в свой корень проекта. Таким образом, у меня есть /myprj и/google-play-services_lib на одном уровне (у меня также есть /facebooksdk и/actionbarsherlock на том же уровне) и перешел к "Import Module" (из существующего источника). Затем щелкнул следующий следующий следующий... (он работал, он был распознан).

Структура проекта выглядит так (название намеренно размыто):

Project Structure

  • Это правильно добавило модуль (как вы можете видеть на скриншоте выше). Теперь мне нужно добавить зависимость, поэтому мой главный проект знает об этом. Я перехожу к своим модулям и списку, выбираю вкладку "Мой основной модуль" и "Зависимости". Я вижу несколько библиотек (время Joda, андроид-запрос, gson и т.д.) И два модуля: FacebookSDK и actionbarsherlock. Все идет нормально. И это когда вещи становятся странными.

Зависимости, которые я пытался добавить.

ПРИМЕЧАНИЕ. В большинстве случаев я попытался проверить и снять флажок экспорта, а также попытался добавить это в модуль sherlockbar одновременно, только для тестирования. Я знаю, что это много комбинаций, но хорошо.

1) Добавьте Jar или каталог (зная, что это было неправильно, я попытался). и указал на .jar, который находится в модуле/библиотеках google, названном: google-play-services.jar.

2) Добавьте Библиотека (а затем добавьте ее в проект (ы))

3) Добавьте Зависимость модуля, (при выборе моего основного проекта). Появится всплывающее окно:

add dependency

ПРОБЛЕМА

Даже я могу ссылаться на PlusClient, и я получаю правильный импорт, когда я пытаюсь добавить SignInButton в моем макете xml, я получаю сообщение об ошибке.

Нет смысла вставлять весь XML-макет, потому что у него нет ничего странного, это просто 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" />

Как говорит Google.

Первым признаком того, что что-то может быть не в порядке, является тот факт, что 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+) с ActionbarSherlock и Google+ Library?

Если да, то как?:)

Ответ 1

По историческим причинам я собираюсь воспроизвести то, что я сделал, взятый из здесь. Большое спасибо @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) Выберите Модули с левой панели, затем нажмите кнопку + (или ⌘ N), затем выберите "модуль импорта" и перейдите к google-play-services_lib, который вы только что скопировали рядом с папке вашего модуля проекта. (/something/).

Мастер задаст ряд вопросов, просто нажмите рядом, настройки по умолчанию прекрасны, но прочитайте, что происходит, поймите, что происходит, это основная концепция в Java, Android и Intellij. Экспериментируйте, если вы не знаете, что говорит каждый диалог (или почему некоторые могут быть пустыми).

После того, как вы закончите, проект Google Play будет добавлен в модули вместе с вашим проектом.

Не закрывайте это окно (или открывайте его снова, если вы это сделали).

3) Все еще в модулях выберите ваш проект/модуль, затем выберите "Зависимости" с правой панели (это вкладка) и, наконец, нажмите кнопку + на внизу (или ⌘ N, который будет работать, если у вас есть фокус на этой вкладке), затем из всплывающего окна выберите "3 зависимостей модуля..." и выберите "google-play-services_lib", который вы добавили на предыдущем шаге. Он должен быть там. Если это не так, вы не добавили модуль на шаге 2.

4) Наконец, Нажмите + кнопку еще раз (или ⌘ N), но на этот раз выберите "1 баночка или каталоги...", перейдите в папку "/libs" вышеуказанного пути и выберите "google-play-services.jar".

5) Нажмите ok и закройте окно структуры проекта.

Если вы это сделали, ваш основной модуль должен иметь зависимость, которая выглядит следующим образом:

Dependencies

Также убедитесь, что в окне "Структура проекта" FACETS вкладка "Службы Google Play" проверена "Библиотечный модуль". Это библиотечный модуль.

Примечание. Убедитесь, что вы не добавили проект "google-play-services_lib" в качестве библиотеки в "Библиотеки" (левая панель в разделе "Модули" ). Если у вас есть, вы можете перейти в " Библиотеки и просто удалить его. Библиотека Google Play не должна появляться в библиотеках.

Кредит: этот текст получен из fooobar.com/info/21333/...