Yandex MapKit вместе с Android Studio #129

Open
LexxxHU opened this Issue May 22, 2013 · 42 comments

Comments

Projects
None yet

LexxxHU commented May 22, 2013

Недавно вышла хорошая среда разработки для android - Android Studio

ознакомиться можно по сылкам
http://habrahabr.ru/company/JetBrains/blog/179815/
http://developer.android.com/sdk/installing/studio.html

Вопрос вот в чем - у кого-нибудь получилось прикрепить яндекс карты к ней? (пытался сделать как в eclipse - add project as library , но там нет такой опции)

Там все есть)
File -> Project Structure -> Libraries
а там уже добавляете библиотеку и ее содержимое.

Только, вот все равно не работает эта библиотека(
объявляю импорт: import ru.yandex.yandexmapkit.MapController;
и уже после ru.yandex.yandexmapkit. не видит ни каких объектов!

На Android Studio кому-нибудь удалось запустить это чудо на данный момент?

Ага. А что интересует?

Собственно интересует как сделать что карта отображалась. В интерфейсе вставляю код

<ru.yandex.yandexmapkit.MapView
        android:id="@+id/map"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:apiKey="мой ключ который прислали" />

и мне сразу ругается на

The following classes could not be instantiated:
- ru.yandex.yandexmapkit.MapView (Open Class, Show Exception)
 Tip: Use View.isInEditMode() in your custom views to skip code or show sample data when shown in the IDE  Exception Details java.lang.UnsatisfiedLinkError: no cache in java.library.path   at java.lang.ClassLoader.loadLibrary   at java.lang.Runtime.loadLibrary0   at java.lang.System.loadLibrary   at ru.yandex.core.CoreApplication.initialize  at ru.yandex.core.CoreApplication.initOnce  at ru.yandex.yandexmapkit.MapSurfaceView.init  at ru.yandex.yandexmapkit.MapSurfaceView.<init>  at ru.yandex.yandexmapkit.MapView.<init>  at java.lang.reflect.Constructor.newInstance   at android.view.LayoutInflater.rInflate_Original   at android.view.LayoutInflater_Delegate.rInflate   at android.view.LayoutInflater.rInflate   at android.view.LayoutInflater.inflate   at android.view.LayoutInflater.inflate   

Да забил на это.
На самом деле заверни его в LinearLayout или во что-то другое и будет показан фрейм.А больше и не надо.

У меня щас так

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".AboutActivity" >

    <ru.yandex.yandexmapkit.MapView
            android:id="@+id/map"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:apiKey="......" />

</RelativeLayout>

после запуска приложения происходит ошибка и оно закрывается, в логах пишет

E/AndroidRuntime: FATAL EXCEPTION: main
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.bibinetsearch/com.bibinetsearch.AboutActivity}: android.view.InflateException: Binary XML file line #11: Error inflating class ru.yandex.yandexmapkit.MapView
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
        at android.app.ActivityThread.access$600(ActivityThread.java:130)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4745)
        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:786)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)
        Caused by: android.view.InflateException: Binary XML file line #11: Error inflating class ru.yandex.yandexmapkit.MapView
        at android.view.LayoutInflater.createView(LayoutInflater.java:613)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
        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:256)
        at android.app.Activity.setContentView(Activity.java:1867)
        at com.bibinetsearch.AboutActivity.onCreate(AboutActivity.java:12)
        at android.app.Activity.performCreate(Activity.java:5008)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
        ... 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:587)
        ... 22 more
        Caused by: java.lang.NoClassDefFoundError: ru.yandex.yandexmapkit.R$string
        at ck.a(Unknown Source)
        at ru.yandex.yandexmapkit.MapController.<init>(Unknown Source)
        at ru.yandex.yandexmapkit.MapSurfaceView.init(Unknown Source)
        at ru.yandex.yandexmapkit.MapSurfaceView.<init>(Unknown Source)
        at ru.yandex.yandexmapkit.MapView.<init>(Unknown Source)
        ... 25 more

На что он ругается?

upd
Туплю.. Вижу что не пример.

Ты проект библиотеки yandex maps kit подключил ? Project structure => Modules > Dependencies

Подключи yandexmapkit-library как Module Dependency

Большое спасибо!
Помогло, правда еще часик поразбирался как добавить его как Dependency. Там видимо для Eclipce все настроено, для андроид студии надо этот модуль импортировать и в нем обязательно classes.jar сделать как библиотека, тогда он появится в списке Module Dependency. После этих манипуляций все начинает работать.

Точно. Удачи

maxlord commented Dec 24, 2013

Возможно кому-нибудь еще поможет.

Я когда подключал мапкит в Android Studio, мне вышеописанные методы не совсем помогли.
Чтобы все заработало, нужно еще so-библиотеку (libcache_local.so) включать в билд.

А так как Android Studio не позволяет включать в билд so-файлы, посему на просторах stackoverflow.com был найден один хак:

Нужно подготовить zip-архив, изменить расширение на jar и включить в билд как jar-файл.
При установке apk-файла, все содержимое скопируется в папку приложения как есть.
Я назвал файл armeabi.jar
И содержимое его такое:

lib
--armeabi
----libcache_local.so

В build.gradle что-то типа:
dependencies {
...
compile files('libs/armeabi.jar')
}

Перепробовал все вышесказанное, так ничего и не помогло! Alligator-bot, Можешь напистать как ты все это заставил работать? В андроид студии совсем недавно, поэтому, лучше все поподробнее.

rz032 commented May 16, 2014

У меня тоже ничего не получается. Alligator-bot, можете написать, как подключить в качестве Module Dependence?
Если не сложно, то можно написать шаги, как подключить yandexmapkit к Android Studio

maxlord commented May 16, 2014

dependencies у основного модуля должны выглядеть так:

dependencies {
compile files('libs/armeabi.jar')
...
compile project(':YandexMapKit')
}

где armeabi.jar - это zip-архив, подготовленный таким образом:
lib
--armeabi
----libcache_local.so

rz032 commented May 17, 2014

maxlord, благодарю за быстрый ответ. Скажите, а строчка compile project(':YandexMapKit'), в которой YandexMapKit - это что именно? В архиве есть sample и library. Если я переношу в папку app основного проекта папку yandexmapkit-sample и потом подключаю ее при помощи compile project(':yandexmapkit-sample'), то получаю ошибку: Project with path yandexmapkit-sample couldn't be found in project ':app'.
И еще. Правильно ли я понял, что архив должен именно содержать структуру lib-armeabi-libcache_local.so?

maxlord commented May 17, 2014

YandexMapKit - это проект, который должен лежать рядом с основным модулем проекта.

Туда помещаешь содержимое папки library.
А также файл build.gradle, такого содержания:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.9.+'
    }
}
apply plugin: 'android-library'

dependencies {
    compile files('libs/classes.jar')
}

android {
    compileSdkVersion 19
    buildToolsVersion '19.0.3'

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        // Move the tests to tests/java, tests/res, etc...
        instrumentTest.setRoot('tests')

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }
}

И еще. Правильно ли я понял, что архив должен именно содержать структуру lib-armeabi-libcache_local.so?

Да, именно такую структуру он и должен содержать

rz032 commented May 17, 2014

Сделал все это - ничего не помогает. Опять такая же ошибка. Видимо, что-то делаю не праавильно.
Создаю директорию MyProject/YandexMapKit. Туда копирую содержимое папки yandexmapkit-library. В ней же создаю build.gradle с вышеописанным содержимым.
Создаю архив armeabi.jar, в которой находится libs\armeabi\libcache_local.so и libs\classes.jar
После этого, дописываю и синхронизирую build.gradle основного проекта и получаю ошибку: Project with path YandexMapKit couldn't be found in project ':app'.

rz032 commented May 17, 2014

Забил я на яндекс-карты, использовал google =) Спасибо за помощь!

Способ maxlord'а работает на ура! Спасибо.

xsen commented Jul 11, 2014

Выше описанный способ работает. Для тех кто не знает как подключить модуль: File->Import module, указываете путь к модулю, в проекте показывается два модуля, далее делаем действия описаные maxlord'ом, только пришлось поправить путь к AndroidManifest.xml и zip архив не нужно подключать.

xsen commented Jul 11, 2014

Точнее даже все проще делается. Все что нужно это импортировать модуль, но видимо у текущей версии Android Studio есть баг, мне пришлось импортировать модуль два раза, первый раз ничего не случилось, после того как IDE корректно импортирует модуль больше ничего делать не надо, все работает само.

DZRock commented Aug 7, 2014

Добрый день, столкнулся с такой же проблемой - не видит проект библиотеки в упор , пробовал различные решения из ветки - так ни к чему и не пришел, при сборке библиотеки вылетает предпуреждение :
Warning:Gradle: module 'map' won't be compiled. Unfortunately you can't have non-Gradle Java module and Android-Gradle module in one project.

Библиотеку подключил в структуре проекта, как зависимость, добавил в модуль yandexmapkit *.jar файлы, как библиотеки - ноль эмоций.
Ошибка :
The following classes could not be instantiated:
- ru.yandex.yandexmapkit.MapView (Open Class, Show Exception)
Tip: Use View.isInEditMode() in your custom views to skip code or show sample data when shown in the IDE Exception Details java.lang.UnsatisfiedLinkError: no cache in java.library.path

IAkumaI commented Aug 7, 2014

fedorov92,
в предпросмотре макета у меня тож так ругается, однако все работает.

В дополнение ко всему вышесказанному скажу, что armeabi.jar нужно положить в папку libs проекта MapKit'а и при этом удалить сам .so файл, иначе проект не сбилдится.

DZRock commented Aug 7, 2014

IAkumaI, спасибо

Ребят, может кому поможет.
Я взял yandexmapkit-library и подключил по http://stackoverflow.com/a/16634680 - этому примеру, дальше Gradle начал ругаться на то, что не скачано некоторое API, я нажал на ошибку и он предложил мне их скачать. Всё. После этого проект успешно собрался.

Как заставить работать Android Studio 1.0.1 c Map Kit??? Таких пунктов меню как вы приводили просто нет :-) Более менее смог найти их аналоги, и проект даже собрался, но не захотел запускаться на эмуляторе.

Все разобрался надо было поставить ARM Translation на Genymotion.И все заработало

diseks commented Jan 15, 2015

Сделал, все как писал maxlord. В итоге заработало. Но нужно учесть ряд моментов:

  1. если тестирование идет на эмуляторе, то нужно в AVD Manager у эмулятора изменить режим CPU/ABI на arm, так как библиотека яндекса нативная под arm. В противном случае будет ошибка при развертывании: INSTALL_FAILED_NO_MATCHING_ABIS
  2. При запуске у меня яндекс потребовал разрешение: uses-permission android:name="android.permission.WRITE_SETTINGS"
  3. В архиве armeabi пришлось переименовать файл libcache_local.so в libcache.so, ибо именно такой файл libcache.so требовала библиотека YandexMapKit.

Может кому поможет.

LexxxHU commented Jan 15, 2015

сделал как написал maxlord (по поводу файла armeabi.jar) - все заработало, до этого выдавало ошибку
Binary XML file line : Error inflating class ru.yandex.yandexmapkit.MapView

Только вот тут пишут http://toster.ru/q/114489 , что нужно удалить кусок кода

Удалил из build.gradle модуля yandexmapkitlibrary такой кусок кода

у меня этого куска кода не было изначально - все работает (с кодом не проверял)

LexxxHU, не могли бы вы прислать проект с подключенной библиотекой. Сделал, как описано у maxlord. Не помогло также переименование библиотеки, как вы советовали. Использую android studio v.1.0.1
Проблема возникает на этапе конструирования объекта MapView
Почта: alexx1524@gmail.com

Тоже добавил как module_dependency
image
image
но программа вылетала, не успевая отобразить окно с вьюшкой Яндекса.
Пробовал решение maxlord, но тоже не помогало.
Затем заметил, что в оригинальной папке yandexmapkit-library есть libs->armeabi с файлом libcache.so, а в папке yandexmapkit-library моего проекта "libs->armeabi" нет. Видимо AndroidStudio при импорте модуля не захотела копировать эту папку. Перенес эту папку и все заработало.
Вот дерево моего проекта:
image

Coden55 commented Feb 26, 2015

Перечитал всю ветку, ожидал большого геморроя...

Import module - папка yandexmapkit-library
Project structure -> app -> dependencies -> add -> module dependency -> :yandexmapkit

Все сразу заработало

TigranOg commented Jul 3, 2015

Перечитал всю ветку. Попробовал все, что можно. Все. Но не работает.
Есть одно НО.

Все работало на всех планшетах, к примеру, на тестовых в офисе Lenovo, 3Q, Samsung Galaxy и наших кастомных. Потом в один днь перестало. Толи потому что я сделал сlean проекта, то ли еще по какой то причине.
Но, что самое интересное, перестало работать только на Samsung и на наших кастомных, которые делают нам китайцы. Наши планшеты, так сказать noname планшеты, на них стоит полноценнцй андройд. Весь функционал вплоть до всяких Google Cloud Messaging работает, а вот карта нет.

В чем может быть проблема? Попробовал посмотреть тип процессов (мало ли, ничего иного не мог придумать) но список примерно одинаковый

Processor : ARMv7 Processor rev 1 (v7l) - 3Q работает на данном планшете
Processor : ARMv7 Processor rev 1 (v7l) - Lenovo работает
Processor : ARMv7 Processor rev 8 (v7l) - Samsung не работает
Processor : ARMv7 Processor rev 0 (v7l) - один из наших планшетов и не работает
Processor : ARMv7 Processor rev 4 (v7l) - один из наших планшетов и не работает

Версии Андройда отличаются, но на всех наших планшетах 4.2.2 и собираю TargetSdk соответствующий.

livotov commented Oct 7, 2015

Для 4.x+ проектов можете еще попробовать мой форк, который перепакован в gradle и положен в maven - https://github.com/livotov/yandexmapkit-android

Good Job! It works!
Maxload and SparrowA you are the best!

Ahilles80 commented May 27, 2016

Подключал библиотеку в Android Studio 2.1.1. Часть знаний почерпнул в этой ветке обсуждений. Coden55 в общем-то прав - никаких танцев с бубном не нужно. Всё достаточно просто.

Вот подробная инструкция:

  1. Скачать библиотеку и примеры её использования
  2. Распаковать архив
    • получаем две директории:
      -- yandexmapkit-library - собственно сама библиотека, которую нам надо подключить
      -- yandexmapkit-samples - примеры использования библиотеки
  3. Добавляем модуль в проект
    • выбираем пункт меню File -> New -> Import Module ... (открывается мастер импорта)
    • указываем путь к директории yandexmapkit-library
    • называем модуль как захочется или оставляем имя yandexmapkitlibrary без изменений
    • оставляем все флажки без изменений
      -- у модуля автоматически появится зависимость от Classes.jar
      -- Android Studio требует докачать SDK 16 (если ещё не установлено) - соглашаемся
  4. Для модуля app указываем зависимость от модуля yandexmapkitlibrary
    • выбираем пункт меню File -> Project Structure
    • в списке модулей (слева под строкой -Modules-) выбираем основной модуль app
    • справа открываем закладку Dependencies
    • добавляем (+) зависимость от модуля (Module dependency) yandexmapkitlibrary
  5. Проверяем работу приложения (всё должно заработать)

Спасибо людям за создание данной ветки. Я лишь просто немного дополнил написанное выше. Надеюсь, что моя инструкция сэкономит кому-нибудь пару часов времени и сохранит некоторое количество нервных клеток...)))

Ahilles80 и Coden55 - вы просто супермегаgoodчеловеки!

Все получилось по инструкции Ahilles80, человек сделал разрозненное - целым!
До этого перечитал ветку и вообщем-то делал все эти шаги но все таки кучу всего другого перепробовал, загадил проект, поэтому и не работало.
Как только весь мусор почистил и сделал все по инструкции - все заработало!

Спасибо!

Nec32 commented Nov 18, 2016

При скачивании архива у меня нету директории yandexmapkit-library. Где взять саму библиотеку?
image

saint13 commented Nov 18, 2016

Библиотека подключается через grade зависимость.

18 нояб. 2016 г. 9:12 пользователь "Nec32" notifications@github.com
написал:

При скачивании архива у меня нету директории yandexmapkit-library. Где
взять саму библиотеку?
[image: image]
https://cloud.githubusercontent.com/assets/23547660/20420465/cebb978c-ad7f-11e6-98ec-c3565057b2c8.png


You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
#129 (comment),
or mute the thread
https://github.com/notifications/unsubscribe-auth/ABSEm4LUQp01_XkhOd_M5SOpJFklhvzsks5q_UG4gaJpZM4ArGEF
.

Nec32 commented Nov 18, 2016

Ммм... Вот так просто теперь. Спасибо

Распаковать архив
получаем две директории:
-- yandexmapkit-library - собственно сама библиотека, которую нам надо подключить
-- yandexmapkit-samples - примеры использования библиотеки
Добавляем модуль в проект
выбираем пункт меню File -> New -> Import Module ... (открывается мастер импорта)
указываем путь к директории yandexmapkit-library
называем модуль как захочется или оставляем имя yandexmapkitlibrary без изменений
оставляем все флажки без изменений
-- у модуля автоматически появится зависимость от Classes.jar
-- Android Studio требует докачать SDK 16 (если ещё не установлено) - соглашаемся

Библиотека подключается через grade зависимость.

Я так и не понял какой фаил нужно....вот этот: yandexmapkit-sample\gradle\wrapper\gradle-wrapper.properties , gradlew ??

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment