Как начать работу с MapKit для Android

Библиотека MapKit для платформы Android 4.0.3 и выше доступна в репозитории Maven Central. Чтобы создать приложение с картой Яндекса:

  1. Шаг 1. Получите ключ для работы с MapKit
  2. Шаг 2. Установите библиотеку MapKit
  3. Шаг 3. Настройте библиотеку
  4. Шаг 4. Соберите и запустите приложение
  5. При дальнейшей работе

Шаг 1. Получите ключ для работы с MapKit

  1. Авторизуйтесь с учетной записью Яндекса или зарегистрируйте новый аккаунт.
  2. Нажмите Получить ключ и выберите пакет MapKit SDK.
  3. Заполните информацию о проекте, укажите нужный тариф и нажмите Отправить.

Дальнейшие инструкции придут на почту.

Полученный ключ можно использовать для работы с MapKit в нескольких приложениях.

Шаг 2. Установите библиотеку MapKit

  1. Создайте новый проект или откройте существующий, например, в Android Studio.
  2. Откройте файл build.gradle проекта. В секции repositories добавьте репозиторий Maven Central:
    repositories {
        ...
        mavenCentral()
    }
  3. Откройте файл build.gradle приложения (модуля). Укажите адрес репозитория и добавьте зависимость:
    repositories {
        maven {
            url "http://maven.google.com/"
        }
    }
    
    dependencies {
        ...
        // Основная библиотека MapKit.
        implementation 'com.yandex.android:mapkit:3.4.0'
        // Дополнительные модули MapKit.
        // Удалите зависимости если ваше приложение не использует их.
        implementation 'com.yandex.android:directions:3.4.0'
        implementation 'com.yandex.android:places:3.4.0'
        implementation 'com.yandex.android:search:3.4.0'
        implementation 'com.yandex.android:transport:3.4.0'
    }
  4. Синхронизируйте проект, чтобы применить изменения. Например, в Android Studio можно нажать Sync Now или выбрать в меню File → Synchronize. Дождитесь окончания синхронизации.

Если синхронизация завершилась успешно, при компиляции библиотека будет добавлена в проект автоматически. При ошибке компиляции, убедитесь что вы правильно указали репозиторий и зависимость и синхронизируйте проект снова.

Шаг 3. Настройте библиотеку

  1. Добавьте карту на Activity:
    <com.yandex.mapkit.mapview.MapView
        android:id="@+id/mapview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
  2. Инициализируйте карту в методе onCreate нужного Activity:
    private MapView mapview;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
        super.onCreate(savedInstanceState);
        MapKitFactory.setApiKey("Ваш API ключ");
        MapKitFactory.initialize(this);
    
        // Укажите имя activity вместо map.
        setContentView(R.layout.map);
        mapview = (MapView)findViewById(R.id.mapview);
        mapview.getMap().move(
            new CameraPosition(new Point(55.751574, 37.573856), 11.0f, 0.0f, 0.0f),
            new Animation(Animation.Type.SMOOTH, 0),
            null);
    }
    Примечание. Не рекомендуется вызывать MapKitFactory.initialize() в методе Application.onCreate(). Это может привести к лишним операциям и повышенному расходу батареи устройства.
  3. Передайте события onStart и onStop в MapKitFactory и mapView. Иначе MapKit не сможет отобразить карту и остановить обработку карты, когда Activity с картой становится невидимым для пользователя:
    @Override
    protected void onStop() {
        super.onStop();
        mapview.onStop();
        MapKitFactory.getInstance().onStop();
    }
    
    @Override
    protected void onStart() {
        super.onStart();
        mapview.onStart();
        MapKitFactory.getInstance().onStart();
    }

Шаг 4. Соберите и запустите приложение

При работе в Android Studio приложение можно сразу запустить, сборка будет выполнена автоматически. Следуйте инструкциям ниже, чтобы запустить приложение на:

При дальнейшей работе

Listener-объекты, сообщающие о результате многократных операций или состоянии объекта, нужно явно сохранять в памяти:

private final CameraListener cameraListener = new CameraListener() {
    // ...
}  
mapview.getMap().addCameraListener(cameraListener);

Пример приложения

package com.yandex.mapkitdemo;

import android.os.Bundle;
import android.app.Activity;

import com.yandex.mapkit.Animation;
import com.yandex.mapkit.MapKitFactory;
import com.yandex.mapkit.geometry.Point;
import com.yandex.mapkit.map.CameraPosition;

import com.yandex.mapkit.mapview.MapView;

/**
 * В этом примере показывается карта и камера выставляется на указанную точку. 
 * Не забудьте запросить необходимые разрешения.
 */
public class MapActivity extends Activity {
    /**
     * Замените "your_api_key" валидным API-ключом.
     * Ключ можно получить на сайте https://developer.tech.yandex.ru/
     */
    private final String MAPKIT_API_KEY = "your_api_key";
    private final Point TARGET_LOCATION = new Point(59.945933, 30.320045);

    private MapView mapView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        /**
        * Задайте API-ключ перед инициализацией MapKitFactory.
        * Рекомендуется устанавливать ключ в методе Application.onCreate,
        * но в данном примере он устанавливается в activity.
        */
        MapKitFactory.setApiKey(MAPKIT_API_KEY);
        /**
        * Инициализация библиотеки для загрузки необходимых нативных библиотек.
        * Рекомендуется инициализировать библиотеку MapKit в методе Activity.onCreate 
        * Инициализация в методе Application.onCreate может привести к лишним вызовам и увеличенному использованию батареи.
        */
        MapKitFactory.initialize(this);
        // Создание MapView.
        setContentView(R.layout.map);
        super.onCreate(savedInstanceState);
        mapView = (MapView)findViewById(R.id.mapview);

        // Перемещение камеры в центр Санкт-Петербурга.
        mapView.getMap().move(
                new CameraPosition(TARGET_LOCATION, 14.0f, 0.0f, 0.0f),
                new Animation(Animation.Type.SMOOTH, 5),
                null);
    }

    @Override
    protected void onStop() {
        // Вызов onStop нужно передавать инстансам MapView и MapKit.
        mapView.onStop();
        MapKitFactory.getInstance().onStop();
        super.onStop();
    }

    @Override
    protected void onStart() {
        // Вызов onStart нужно передавать инстансам MapView и MapKit.
        super.onStart();
        MapKitFactory.getInstance().onStart();
        mapView.onStart();
    }
}     

Полный код примера доступен в репозитории GitHub.