Начало работы с MapKit для Android
В этом руководстве объясняется как установить и настроить библиотеку MapKit и создать карту с меткой для определенной локации.
Шаг 1. Получите API-ключ для работы с MapKit
Перед тем, как использовать MapKit SDK в своем приложении, вам нужно получить API-ключ.
-
Перейдите в Кабинет Разработчика.
-
Авторизуйтесь с учетной записью Яндекса или зарегистрируйте новый аккаунт.
-
Нажмите Подключить API и выберите MapKit – мобильный SDK.
-
Введите информацию о себе и своем проекте, выберите тарифный план и нажмите Продолжить.
-
После того, как ваш API-ключ будет успешно создан, он будет доступен на вкладке Интерфейсы API → MapKit – мобильный SDK.
Примечание
Активация API-ключей занимает около 15 минут.
Шаг 2. Добавьте библиотеку MapKit в проект
Библиотека MapKit SDK для Android 5.0 и более поздних версий доступна в репозитории Maven Central.
-
Создайте новый проект или откройте существующий, например, в Android Studio.
-
Откройте файл
build.gradle
проекта. В секцииrepositories
добавьте репозитории Maven Central и Google Maven:repositories { ... mavenCentral() maven { url "http://maven.google.com/" } }
-
Откройте файл
build.gradle
приложения (модуля). В секцииdependencies
добавьте зависимость:dependencies { // Облегченная библиотека, содержит только карту, слой пробок, // LocationManager, UserLocationLayer // и возможность скачивать офлайн-карты (только в платной версии). implementation 'com.yandex.android:maps.mobile:4.6.1-lite' // Полная библиотека в дополнение к lite версии предоставляет автомобильную маршрутизацию, // веломаршрутизацию, пешеходную маршрутизацию и маршрутизацию на общественном транспорте, // поиск, suggest, геокодирование и отображение панорам. // implementation 'com.yandex.android:maps.mobile:4.6.1-full' }
-
Синхронизируйте проект, чтобы применить изменения. Например, в Android Studio можно нажать Sync Now или выбрать в меню File → Synchronize. Дождитесь окончания синхронизации.
Если синхронизация завершилась успешно, при компиляции библиотека будет добавлена в проект автоматически.
Шаг 3. Добавьте API-ключ для MapKit
Для MapKit SDK необходимо, чтобы вы установили API-ключ с помощью MapKitFactory.setApiKey.
Рекомендуем сделать это в методе Application.onCreate
:
override fun onCreate() {
super.onCreate()
MapKitFactory.setApiKey("YOUR_API_KEY")
}
Если вы не хотите, чтобы ваш API-ключ хранился в системе контроля версий, вы можете настроить его подстановку из файла local.properties
с помощью класса BuildConfig
:
-
Откройте или создайте файл
local.properties
проекта. Добавьте следующее свойство, подставив вместоYOUR_API_KEY
значение вашего API-ключа:MAPKIT_API_KEY=YOUR_API_KEY
Примечание
Убедитесь, что файл
local.properties
игнорируется системой контроля версий. -
Откройте файл
build.gradle
проекта. Добавьте код для загрузки API-ключа из файлаlocal.properties
:ext { mapkitApiKey = getMapkitApiKey() } private String getMapkitApiKey() { def properties = new Properties() project.file("local.properties").withInputStream { properties.load(it) } return properties.getProperty("MAPKIT_API_KEY", "") }
-
В файле
build.gradle
приложения в поле BuildConfig введите значение переменнойmapkitApiKey
(в нее загружается API-ключ):defaultConfig { // ... buildConfigField "String", "MAPKIT_API_KEY", "\"${mapkitApiKey}\"" }
-
Добавьте API-ключ в
MapKitFactory
, используя полеBuildConfig.MAPKIT_API_KEY
:override fun onCreate() { super.onCreate() MapKitFactory.setApiKey(BuildConfig.MAPKIT_API_KEY) }
Шаг 4. Добавьте карту
-
Добавьте
MapView
в xml-разметку Activity:<com.yandex.mapkit.mapview.MapView android:id="@+id/mapview" android:layout_width="match_parent" android:layout_height="match_parent" />
-
Чтобы инициализировать библиотеку MapKit, вызовите метод MapKitFactory.initialize в
Activity.onCreate
. Создайте приватное свойствоmapView: MapView
.private lateinit var mapView: MapView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) MapKitFactory.initialize(this) setContentView(R.layout.activity_main) mapView = findViewById(R.id.mapview) }
Важно
С помощью вызова
MapKitFactory.initialize(Context)
загружаются все необходимые для MapKit нативные библиотеки. -
Отправьте события
onStart
иonStop
вMapKitFactory
иMapView
, переопределив методыActivity.onStart
иActivity.onStop
для Activity:override fun onStart() { super.onStart() MapKitFactory.getInstance().onStart() mapView.onStart() } override fun onStop() { mapView.onStop() MapKitFactory.getInstance().onStop() super.onStop() }
Иначе MapKit не сможет отображать карту и прекратит ее обработку, когда Activity с картой станет невидимой для пользователей.
Создайте и запустите приложение. Пример приложения с кликабельной картой:
Чтобы изменить положение или масштаб карты, используйте метод Map.move:
override fun onCreate(savedInstanceState: Bundle?) {
// ...
map.move(
CameraPosition(
Point(55.751225, 37.629540),
/* zoom = */ 17.0f,
/* azimuth = */ 150.0f,
/* tilt = */ 30.0f
)
)
}
Map.move принимает на вход аргумент CameraPosition, который полностью задает положение, масштаб, наклон и азимут карты.
Карты по умолчанию поддерживают несколько действий: перемещение, поворот, изменение масштаба и наклон.
Без дополнительной настройки карта будет отображаться с минимально возможным масштабом для экрана пользователя.
Пример Activity после изменения карты:
Шаг 5. Обратите внимание при дальнейшей работе
MapKit хранит слабые ссылки на передаваемые ему Listener-объекты. Необходимо самим хранить ссылку на них в памяти:
val cameraListener = CameraListener { _, _, _, _ ->
// ...
}
mapView.mapWindow.map.addCameraListener(cameraListener)
Примечание
По умолчанию методы всех Listener-объектов и платформенных интерфейсов вызываются на главном потоке, если в документации метода не сказано обратное.
Шаг 6. Отображение метки на карте
Изменим приложение таким образом, чтобы вы могли показывать на карте кликабельную метку.
-
Добавьте в проект ресурс
png
для изображения метки.Например, есть изображение, и оно доступно по идентификатору
R.drawable.ic_pin
. -
Добавьте метку для коллекции Map.getMapObjects в определенное место.
Используйте ImageProvider.fromResource, чтобы создать экземпляр ImageProvider для изображения метки.
override fun onCreate(savedInstanceState: Bundle?) { // ... val imageProvider = ImageProvider.fromResource(this, R.drawable.ic_pin) val placemark = mapView.map.mapObjects.addPlacemark().apply { geometry = Point(59.935493, 30.327392) setIcon(imageProvider) } }
-
Чтобы подписаться на нажатия на созданную метку, используйте метод MapObject.addTapListener.
private val placemarkTapListener = MapObjectTapListener { _, point -> Toast.makeText( this@MainActivity, "Tapped the point (${point.longitude}, ${point.latitude})", Toast.LENGTH_SHORT ).show() true } override fun onCreate(savedInstanceState: Bundle?) { // ... placemark.addTapListener(placemarkTapListener) }
Соберите и запустите приложение. На карте есть метка с вашим изображением. Коснитесь метки, и появится всплывающее сообщение:
Исходный код
Полные примеры кода из руководства вы можете найти в приложении map-with-placemark
в нашем репозитории на GitHub.