Импортирование 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» (из существующего источника). Затем щелкнул следующий следующий следующий … (он работал, он был признан).

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

Структура проекта

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

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

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

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

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

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

Добавить зависимость

ПРОБЛЕМА

Даже если я могу ссылаться на 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?

Если да, то как? 🙂

По историческим причинам я собираюсь воспроизвести то, что я сделал, взятый отсюда . Большое спасибо @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 и закройте окно структуры проекта.

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

зависимости

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

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

Кредит : этот текст исходит из этого ответа StackOverflow

Intereting Posts
Как прокрутить экран в android Объявление enum в java Метод findViewById (int) не определен для типа Удаление фонового изображения ImageButton в Android, но продолжайте onClick highlight Следует использовать Flurry в сервисах и AsyncTasks? Как установить прослушиватель в редакторе текста вида пользовательского списка в андроиде Как установить TextStyle для PagerTabStrip в Жирный? Добавить атрибут в теге «приложение» в AndroidManifest из плагина cordova Twitter4J + Android: вызов аутентификации – это исключение для Null OutOfMemoryError при компиляции моего приложения для Android с градиентом Kotlin – Добавить элементы в ExpandableListView (Android Layout) Решение для кнопки «Место» поверх изображения неправильной формы или обнаружения касания (осязаемая область) определенной области изображения? Поиск в XML-файле с помощью XPath в Android Как можно создать игру в Unity на Android-устройстве? Может ли кто-нибудь подтвердить эту проблему (ограниченное количество файловых дескрипторов на некоторых устройствах Android)?