Интеграция карт в ваше Android-приложение

Есть много разных идей, для реализации которых могут понадобиться карты на мобильных устройствах.
Возможности таких устройств позволяют довольно оперативно получать информацию о местоположении, графические данные и графические преобразования для отображения объёма ландшафта.

В данном статье я расскажу как интегрировать возможность просмотра карт для мобильных устройств на основе Android, на примере Yandex Карт и Google Maps.
Функционал библиотек этих компаний позволяет:
  • Перемещать карту
  • Изменять масштаб
  • Изменять виды карт
  • Получать события от карты




Начнём с отечественного производителя.

Yandex


Библиотеку Yandex MapKit можно скачать с GitHub'а, там же есть версия и для iOS.
Но прежде чем начать использовать, нам надо получить API-key, для этого идём на почту и пишем письмо в support@mobmaps.yandex.ru, указав в заголовке «Map Kit запрос API-ключа». В ответ вам пришлют письмо с указанием дополнительных ссылок на документацию, на правила использования и собственно с самим ключом в теле письма (а могут и не прислать, кстати).

Пока ждём письмо, берём библиотеку и прикрепляем её к проекту.

После долгого ожидания с кружкой кофе, знакомимся с содержимым письма и информации по ссылкам, берём ключик и пишем в вашем layout'е приложения следующий код:
<ru.yandex.yandexmapkit.MapView
        android:id="@+id/map"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:apiKey="you are key" />

где заместо «you are key» вставляем полученный ключ. Всё, карта есть.

Далее код показывает, как перемещать карту на заданную координату и использовать зум:
final MapView mMapView = (MapView) findViewById(R.id.map);
 
// Получаем MapController
MapController mMapController = mMapView.getMapController();
 
// Перемещаем карту на заданные координаты
mMapController.setPositionAnimationTo(new GeoPoint(60.113337, 55.151317));
 
mMapController.setZoomCurrent(15);


Google


Для использования Google Maps надо совершить куда более изощрённые действия. Я расскажу, как получить debug-key для использования карт, но процесс получения release версии похоже несколько замороченней, но я release ещё не получал.

Для получения debug-key, надо найти ваше хранилище ключей, для отладки.
По-умолчанию, путь будет выглядеть примерно так:
C:\Documents and Settings\<user>\.android\debug.keystore

Затем открываем командную строку, переходим в каталог, куда установлена Java:
cd C:\Program Files\Java\jre6\bin

Затем пишем:
keytool -list -alias androiddebugkey
 -keystore <путь_до_хранилища_ключей>.keystore
 -storepass android
 -keypass android

где путь_до_хранилища_ключей — свой путь до debug.keystore (осторожно, возможны проблемы с пробелами в пути).

После чего в том же окне будет выведен md5-ключ после «Certificate fingerprint (MD5)».
Идём по ссылке и регистрируем код.
После чего Google сгенерирует с нужным кодом для layout и встроенным кодом, берём его и вставляем к себе в layout.
Далее нам, надо наш Activity представить в примерно следующем виде:
package com.fewpeople.geoplanner;
 
import android.os.Bundle;
import com.google.android.maps.MapActivity;
 
public class GeoMapActivity extends MapActivity {

    @Override
    public void onCreate(Bundle savedInstanceData) {
        super.onCreate(savedInstanceData);
        setContentView(R.layout.geomap);
    }
    
    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }
}


Замечу, что Activity наследован должен быть от MapActivity хранящийся в com.google.android.maps.MapActivity.
А в манифесте прописать между тегами
<application></application>
вставить:
<uses-library android:name="com.google.android.maps" />

И не забыть, про разрешение доступа в интернет для приложения:
<uses-permission android:name="android.permission.INTERNET" />


В остальном функционал GoogleMaps и YandexMapKit весьма схож:
final MapView mMapView = (MapView) findViewById(R.id.mapview);
 
// Получаем MapController
MapController mMapController = mMapView.getController();
 
// Перемещаем карту на заданные координаты
mMapController.animateTo(new GeoPoint(60.113337, 55.151317));
 
mMapController.setZoom(15);


Как можно видеть, процесс интеграции карт в приложения довольно простой, а спектр использования довольно широк.
Более подробно можно ознакомиться ниже.

Определение собственной позиции


Чтобы немного расширить пример, приложу кусок кода:
final MapView cMapView = (MapView) findViewById(R.id.map);
 
// Получаем MapController
MapController cMapController = cMapView.getMapController();

// Включаем элементы интерфейса, контролирующие зум
cMapView.setBuiltInZoomControls(true);

// Создаём менеджер местоположения и "слушателя"
final LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
final LocationListener locationListener = new LocationListener() {
		
	@Override
	public void onStatusChanged(String provider, int status, Bundle extras) {}
			
	@Override
	public void onProviderEnabled(String provider) {}
			
	@Override
	public void onProviderDisabled(String provider) {}
			
	@Override
	public void onLocationChanged(Location location) {}
};
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

// создаём overlay для отображения своей позиции
cMyLocationOverlay = new MyLocationOverlay(this, cMapView);
cMyLocationOverlay.disableCompass();
cMyLocationOverlay.enableMyLocation();
cMapView.getOverlays().add(cMyLocationOverlay);
 
// зум
cMapController.setZoomCurrent(15);

// Получаем свои координаты (можно использовать LocationManager.NETWORK_PROVIDER, для иного способа определения позиции)
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

// Перемещаем карту на заданные координаты
cMapController.animateTo(new GeoPoint((int) location.getLatitude() * 1000000, (int) location.getLongitude() * 1000000));


Но для использования этого кода, в манифесте следует указать следующее разрешение:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />




Список используемого материала:
Hello, MapView (developers.android.com)
Google Maps получение Api (временный)
Получение Google Maps API Key
Карты в вашем Android-приложении
Пишем простое приложение с использованием GoogleMap и прокачанным SimpleCursorAdapter
Условия использования сервиса «Yandex Map Kit»
Yandex Map Kit для Android OS в примерах (Максим Хромцов)
Максим Хромцов. Yandex MapKit для Android OS в примерах (Видео)
Share post

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 22

    +1
    По теме карт для Android — mapp.android-libraries.com — компонента для разработки кастомных оффлайновых карт.
      0
      Спасибо за ссылку, надо будет посмотреть.
      0
      Google Maps API V3 не требует ключа, разве нет?

      Пруф:
      Note: This version of the Google Maps JavaScript API no longer needs API keys!
        +3
        Обратите внимание на слово JavaScript
        0
        А есть возможность наложить на какую-то из карт своё изображение?
        Например вся карта отображается как карты google, но один микрорайон города — это моя картинка. И соответственно что бы были те же возможности зума, поворота и прокрутки карты.
          +1
          Рисовать в overlay можно попробовать, пока иного способа в голову не приходит.
          +1
          А что насчёт OSM?
            0
            Там тоже есть какие-то решения, но я не смотрел ещё.

            Вот что-то типа этого: code.google.com/p/osmdroid/
            На сколько это всё работает не знаю, ещё не пробовал.
              +1
              Есть одна замечательная библиотека. Эх грех мне ее рекламировать :)
              Но любителям векторных карт подойдет code.google.com/p/mapsforge/.

              И еще немного не по теме вопрос.
              Кто-нибудь знает как можно вызывать код из другого приложения, по-типу плагина. Обычная схема работы, что вы в приложение встраиваете карту и т.п., что конечно хорошо не всегда самое лучшее.
              А возможно ли наоборот, вставить слой в существующее картографическое приложение, например в Google Maps? Что надо сделать для этого карто-приложению и слое-приложению?

              Вроде как сервис не работает, так как связано с UI… Не передавать же байты между приложениями, особенно если картинки нужны.
              • UFO just landed and posted this here
              +5
              Дополнение по тому как делать релизную версию, годную для выкладывания на Android Market:
              1) Генерируем приватный ключ, который будет использоваться для подписи вашего APK файла:
              keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000 (keytool — стандартная утилита из состава JDK, например она лежит тут: c:\Program Files\Java\jdk1.5.0\bin\)
              заполняем ответы на вопросы (пароль, имя, организация, страна и тд)
              В результате получаем в текущей дирректории файл: my-release-key.keystore

              2) получаем «отпечаток» с ключа:
              keytool -list -alias alias_name -keystore my-release-key.keystore -storepass password -keypass password

              Результат:
              Certificate fingerprint (MD5): 2B:72:AB:05:EE:98:C5:4C:12:9F:04:F3:DB:25:FE:A2

              3) генерируем Android Maps API key:
              Идем на Sign Up for the Android Maps API страницу и вставляем в поле внизу полученный ранее «отпечаток» 2B:72:AB:05:EE:98:C5:4C:12:9F:04:F3:DB:25:FE:A2

              Результат — наш релизный ключ для карт «0Pt9RihjZq7zjNeNXafCD0ll2FPS_TPffQS90zA»
              который используем в наших лейаутах:
              <com.google.android.maps.MapView
                               android:layout_width="fill_parent"
                               android:layout_height="fill_parent"
                               android:apiKey="0Pt9RihjZq7zjNeNXafCD0ll2FPS_TPffQS90zA"
                               />

              Генерация подписанного APK:
              Правый клик на проекте в Eclipse: Android Tools > Export Signed Application Package, указываем путь к нашему my-release-key.keystore и вводим пароль
              Источники:
              Signing Your Applications
              Obtaining a Maps API Key
              Android Maps API Key Signup
                0
                «you are key» — порадовал, что это могло значить…
                0
                Интересно зачем эти apiKey вообще нужны? Для статистики что ли?
                  +2
                  Думаю для контроля(статистика, баны) и возможности дальнейшей монетизации в будущем (можно сделать встроенную рекламу, платные ключи без рекламы, платные ключи с более полной инфой)
                    0
                    возможности дальнейшей монетизации в будущем (можно сделать встроенную рекламу, платные ключи без рекламы, платные ключи с более полной инфой)


                    Вы как в воду глядели :)
                  0
                  Хороший туториал. Спасибо автору. Однако в строчке, в которой задается положение пользователя, происходит сначала взятие целой части от долготы и широты, а потом уже приведение к необходимому виду, что приводит к неправильному положению на карте. Поправьте пожалуйста.
                    0
                    Кстати, да. А исправляется заменой

                    // Перемещаем карту на заданные координаты
                    cMapController.animateTo(new GeoPoint((int) location.getLatitude() * 1000000, (int) location.getLongitude() * 1000000));

                    на

                    // Перемещаем карту на заданные координаты
                    double lat = location.getLatitude();
                    double lng = location.getLongitude();
                    GeoPoint point = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6));
                    mMapController.animateTo(point);
                      0
                      Так точно. Моя оплошность, спасибо.
                    0
                    Огромное спасибо за статью.
                    Хотя всё равно пришлось несколько часов пыхтеть и проклинать скудность информации в интернете про mapkit, пока опытным путём не дошёл до того, как правильно подключать либы для него и включать зависимости в Itellij IDEA (к эклипсу физическая неприязнь).

                  Only users with full accounts can post comments. Log in, please.