26 October 2011

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

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

В данном статье я расскажу как интегрировать возможность просмотра карт для мобильных устройств на основе 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 в примерах (Видео)
Tags:androidandroid developmentgoogle mapsyandex mapsjava
Hubs: Development for Android
+36
114.2k 188
Comments 22
Popular right now
Android-разработчик
to 80,000 ₽AmigowebМагнитогорскRemote job
Android-разработчик
from 80,000 ₽FlowwowRemote job
Android-разработчик
from 170,000 to 230,000 ₽ENJOY PROСанкт-ПетербургRemote job
Android Developer
from 150,000 to 200,000 ₽/difway.studioRemote job
Android разработчик
from 140,000 to 180,000 ₽Онлайн-кинотеатр iviМосква