пятница, 30 ноября 2012 г.

Работа с картами в Google Android


Сегодня я хочу вам рассказать как правильно работать с картами в Android, это может показаться непростым занятием, но на деле это в принципе довольно просто, тут в уроке я рассмотрю от создания простого приложения в котором будет только карта и закончу приложением в котором мы будем выводить графические элементы на карте и находить текущее местоположение. Начнем мы конечно же с простого и создадим приложение в котором мы будем выводить на экран карту, но для этого нам нужно сгенерировать ключ что бы наша карта могла выводиться на экране телефона, чем мы сейчас и займемся.



1. Создание ключа и подготовка работы с картой

Для начала создаем проект в Eclipse — File — New Android Project. Дальше переходим на сайте гуглаdevelopers.google.com/android/maps-api-signup?hl=ru на котором видим формочку ввода md5 ключа, его мы сгенерируем у себя на компьютере с помощью командной строки. Запускаем CMD, «Пуск — Выполнить — cmd» в адресной строке пишем вот такую красоту

c:\<<b>path-to-jdk-dir</b>>\bin\keytool.exe -list -alias androiddebugkey -keystore "C:\users\<user-name>\.android\debug.keystore" -storepass android -keypass android


где path-to-jdk-dir — это путь к вашему jdk, у меня оно находится по адресу C:\Program Files\Java\jdk1.7.0_07.
user-name — имя вашего пользователя компьютера.

далее вбиваем туда же в консоль

keytool.exe -list -alias androiddebugkey -keystore "C:\users\ravi\.android\debug.keystore" -storepass android -keypass android


C:\users\ravi\.android\debug.keystore — может быть другой, у меня например вот такой: C:\Users\Admin\.android\debug.keystore

Должно выглядеть все это так:

Далее вставляем на сайте который я вам дал адрес наш md5 код и получаем ключ для открытия карты в андроиде:

После нажатия на кнопку генерировать вы получите вот такое:
Если MapActivity не импортируется само тогда вам нужно в папку libs/ засунуть http://dl.dropbox.com/u/61086119/maps.jar, его можно найти в папке android-sdk в папке libs любого проекта, но я вам упрощу жизнь...

2. Создание карты и её вывод на экран

Теперь открываем наш main.xml и вставляем код в нашу вьюшку MapView. Выглядеть оно все будет вот так:

main.xml
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.maps.MapView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mapView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true"
    android:apiKey="05M-7qOGbEjYduPPUdQgJt9ysL8HToawGdvu_ow"
/>


Дальше открываем MainActivity и наследуем её от MapActivity для того что бы наши объекты и классы которые мы дальше будем использовать импортировались без всяких проблем, ну и конечно для того что бы мы могли работать с картой. Пишем вот такое:

MainActivity.java
import android.os.Bundle;
import com.google.android.maps.MapActivity;
 public class AndroidGoogleMapsActivity extends MapActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
 
    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }
}


Теперь запускаем проект и вуаля! у нас запустилась карта. Выглядеть все что вы сделали будет вот так:

3. Добавление увеличения / уменьшения карты

Для того что бы увеличивать и уменьшать карту нужно добавить элемент ZoomControls или ZoomButtons в нашу xml разметку, в нашем случае это main.xml и написать в MainActivity в onCreate() следующие строки:

// Displaying Zooming controls
MapView mapView = (MapView) findViewById(R.id.mapView); //определяем карту
mapView.setBuiltInZoomControls(true);
// задаем уменьшение и увеличение карты

4. Выбор типа карты

Для создания типа карты можете создать например меню или кнопки на карте которые будут вызывать один из этих методов:

mapView.setSatellite(true); // Satellite View
mapView.setStreetView(true); // Street View
mapView.setTraffic(true); // Traffic View


Пишутся они так же в onCreate(), в месте где вы захотите, например при нажатии кнопки, текствьюшки или при выборе элемента в меню.

5. Добавление маркера на карту.

Для добавления маркера на карту нам понадобиться создать кнопку по которой мы будем выводить маркер по заданным координатам.

Значит создаем кнопку в main.xml, надеюсь мне не нужно писать как создавать кнопки, и большинство знает как это делается, далее в MainActivity.java в onCreate() создаем листенера этой кнопки и внутри onClick() пишем следующий код:



String provider;
LocationManager locationManager;
//......
//задаем координаты
GeoPoint myLication = new GeoPoint((int) latitude, (int) longitude);  // перемещаемся туда при помощи данной функции, mc - объект типа MapController
mc.animateTo(myLication); // рисуем картинку на экране
Drawable makerDefault = getResources().getDrawable(R.drawable.pushpin); //выводим маркер на карте
MirItemizedOverlay itemizedOverlay = new MirItemizedOverlay(makerDefault); //задаем координаты маркеру
itemizedOverlay.addOverlayItem((int) latitude, (int) longitude, "My Location");
//выводи картинку по заданным координатам
mapView.getOverlays().add(itemizedOverlay);
//перемещаемся к центру экрана
mc.setCenter(new GeoPoint((int) latitude, (int) longitude));


latitude — широта, например 34159000.
longitude — долгота, например 73220000.

Если вы вставите эти параметры в геопоинт то наш маркет выведется где-то примерно в Азербайджане.

pushpin — наша картинка которую мы будем выводить на экране, на карте.


6. Нахождение местоположения пользователя при помощи GPS

Тут все довольно просто, использовать мы будем тот же код что и на один пункт выше, только с дополнительной вставкой определения местоположения, для этого нам нужно имплементировать нашей Activity дополнительный класс LocationListener вот так:

public class MainActivity extends MapActivity implements LocationListener {...}


А внутри всего этого создаем отдельный метод в который записываем наш код для определения местоположения.

String provider;
LocationManager locationManager;
//......
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        Criteria criteria = new Criteria();
        provider = locationManager.getBestProvider(criteria, false);
        //проверка на пустоту провайдера
        if ((provider != null) && !provider.equals("")) {
                //определяем местоположение
                Location location = locationManager.getLastKnownLocation(provider);
                locationManager.requestLocationUpdates(provider, 20000, 1, this);
                if (location != null) {
                        //задаем координаты
                        GeoPoint myLication = new GeoPoint((int) latitude, (int) longitude);  
                        // перемещаемся туда при помощи данной функции mc - MapController
                        mc.animateTo(myLication); 
                        // рисуем картинку на экране
                        Drawable makerDefault = getResources().getDrawable(R.drawable.pushpin); 
                        //выводим маркер на карте
                        MirItemizedOverlay itemizedOverlay = new MirItemizedOverlay(makerDefault); 
                        //задаем координаты маркеру
                        itemizedOverlay.addOverlayItem((int) latitude, (int) longitude, "My Location");
                        //выводи картинку по заданным координатам
                        mapView.getOverlays().add(itemizedOverlay);
                        //перемещаемся к центру экрана
                        mc.setCenter(new GeoPoint((int) latitude, (int) longitude));
                } else {
                        Toast.makeText(getBaseContext(), "Location can't be retrieved", Toast.LENGTH_SHORT).show();
                }
        } else {
                Toast.makeText(getBaseContext(), "No Provider Found", Toast.LENGTH_SHORT).show();
        }


Ну и как последний штрих нам нужно добавить примишены для работы с GPS, для работы с интернетом, и для определения местоположения. Выше тэга пишем следующее:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />


Ну и все, теперь запускаем приложение запускаем интернет запускаем GPS и запускаем программу, кстати если вы не сделали проверку на наличие интернета, по этому перед запуском программы включите интернет и жпс и тогда ни ошибок не будет, не должно быть (:

Все вопросы постим в комментариях, буду стараться отвечать по возможности.

Скачать с GiHub  & Скачать с Dropbox

3 комментария: