yandexmapkit-android
yandexmapkit-android copied to clipboard
Yandex MapKit вместе с Android Studio
Недавно вышла хорошая среда разработки для 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. После этих манипуляций все начинает работать.
Точно. Удачи
Возможно кому-нибудь еще поможет.
Я когда подключал мапкит в 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, Можешь напистать как ты все это заставил работать? В андроид студии совсем недавно, поэтому, лучше все поподробнее.
У меня тоже ничего не получается. Alligator-bot, можете написать, как подключить в качестве Module Dependence? Если не сложно, то можно написать шаги, как подключить yandexmapkit к Android Studio
dependencies у основного модуля должны выглядеть так:
dependencies { compile files('libs/armeabi.jar') ... compile project(':YandexMapKit') }
где armeabi.jar - это zip-архив, подготовленный таким образом: lib --armeabi ----libcache_local.so
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?
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?
Да, именно такую структуру он и должен содержать
Сделал все это - ничего не помогает. Опять такая же ошибка. Видимо, что-то делаю не праавильно. Создаю директорию 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'.
Забил я на яндекс-карты, использовал google =) Спасибо за помощь!
Способ maxlord'а работает на ура! Спасибо.
Выше описанный способ работает. Для тех кто не знает как подключить модуль: File->Import module, указываете путь к модулю, в проекте показывается два модуля, далее делаем действия описаные maxlord'ом, только пришлось поправить путь к AndroidManifest.xml и zip архив не нужно подключать.
Точнее даже все проще делается. Все что нужно это импортировать модуль, но видимо у текущей версии Android Studio есть баг, мне пришлось импортировать модуль два раза, первый раз ничего не случилось, после того как IDE корректно импортирует модуль больше ничего делать не надо, все работает само.
Добрый день, столкнулся с такой же проблемой - не видит проект библиотеки в упор , пробовал различные решения из ветки - так ни к чему и не пришел, при сборке библиотеки вылетает предпуреждение : 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
fedorov92, в предпросмотре макета у меня тож так ругается, однако все работает.
В дополнение ко всему вышесказанному скажу, что armeabi.jar нужно положить в папку libs проекта MapKit'а и при этом удалить сам .so файл, иначе проект не сбилдится.
IAkumaI, спасибо
Ребят, может кому поможет. Я взял yandexmapkit-library и подключил по http://stackoverflow.com/a/16634680 - этому примеру, дальше Gradle начал ругаться на то, что не скачано некоторое API, я нажал на ошибку и он предложил мне их скачать. Всё. После этого проект успешно собрался.
Как заставить работать Android Studio 1.0.1 c Map Kit??? Таких пунктов меню как вы приводили просто нет :-) Более менее смог найти их аналоги, и проект даже собрался, но не захотел запускаться на эмуляторе.
Все разобрался надо было поставить ARM Translation на Genymotion.И все заработало
Сделал, все как писал maxlord. В итоге заработало. Но нужно учесть ряд моментов:
- если тестирование идет на эмуляторе, то нужно в AVD Manager у эмулятора изменить режим CPU/ABI на arm, так как библиотека яндекса нативная под arm. В противном случае будет ошибка при развертывании: INSTALL_FAILED_NO_MATCHING_ABIS
- При запуске у меня яндекс потребовал разрешение: uses-permission android:name="android.permission.WRITE_SETTINGS"
- В архиве armeabi пришлось переименовать файл libcache_local.so в libcache.so, ибо именно такой файл libcache.so требовала библиотека YandexMapKit.
Может кому поможет.
сделал как написал maxlord (по поводу файла armeabi.jar) - все заработало, до этого выдавало ошибку Binary XML file line : Error inflating class ru.yandex.yandexmapkit.MapView
Только вот тут пишут http://toster.ru/q/114489 , что нужно удалить кусок кода
Удалил из build.gradle модуля yandexmapkitlibrary такой кусок кода
у меня этого куска кода не было изначально - все работает (с кодом не проверял)