yandexmapkit-android icon indicating copy to clipboard operation
yandexmapkit-android copied to clipboard

Yandex MapKit вместе с Android Studio

Open LexxxHU opened this issue 11 years ago • 42 comments

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

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

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

LexxxHU avatar May 22 '13 11:05 LexxxHU

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

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

Nuclominus avatar May 23 '13 13:05 Nuclominus

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

Alligator-bot avatar Aug 15 '13 14:08 Alligator-bot

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

SergVorontsov avatar Aug 15 '13 14:08 SergVorontsov

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

<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   

Alligator-bot avatar Aug 15 '13 15:08 Alligator-bot

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

SergVorontsov avatar Aug 16 '13 10:08 SergVorontsov

У меня щас так

<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

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

Alligator-bot avatar Aug 16 '13 11:08 Alligator-bot

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

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

SergVorontsov avatar Aug 16 '13 11:08 SergVorontsov

Да map_kit_set

Alligator-bot avatar Aug 16 '13 11:08 Alligator-bot

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

SergVorontsov avatar Aug 16 '13 14:08 SergVorontsov

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

Alligator-bot avatar Aug 16 '13 15:08 Alligator-bot

Точно. Удачи

SergVorontsov avatar Aug 16 '13 15:08 SergVorontsov

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

Я когда подключал мапкит в 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') }

maxlord avatar Dec 24 '13 20:12 maxlord

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

Tema-man avatar Jan 26 '14 18:01 Tema-man

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

rz032 avatar May 16 '14 21:05 rz032

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

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

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

maxlord avatar May 16 '14 21:05 maxlord

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?

rz032 avatar May 17 '14 07:05 rz032

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?

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

maxlord avatar May 17 '14 07:05 maxlord

Сделал все это - ничего не помогает. Опять такая же ошибка. Видимо, что-то делаю не праавильно. Создаю директорию 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 avatar May 17 '14 07:05 rz032

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

rz032 avatar May 17 '14 17:05 rz032

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

alehmazok avatar May 26 '14 16:05 alehmazok

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

xsen avatar Jul 11 '14 08:07 xsen

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

xsen avatar Jul 11 '14 10:07 xsen

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

iyfedorov avatar Aug 07 '14 11:08 iyfedorov

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

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

IAkumaI avatar Aug 07 '14 12:08 IAkumaI

IAkumaI, спасибо

iyfedorov avatar Aug 07 '14 15:08 iyfedorov

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

Mikhail-dev avatar Oct 16 '14 05:10 Mikhail-dev

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

SparrowA avatar Jan 12 '15 19:01 SparrowA

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

SparrowA avatar Jan 13 '15 10:01 SparrowA

Сделал, все как писал 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.

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

diseks avatar Jan 15 '15 04:01 diseks

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

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

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

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

LexxxHU avatar Jan 15 '15 09:01 LexxxHU