English French German Spain Italian Dutch Russian Portuguese Japanese Korean Arabic Chinese Simplified

6 окт. 2010 г.

Использование Google Maps в Android

   Google Maps API позволяет добавлять в Android приложения возможность работы с картами Google. Чтобы подключить карты к вашему проекту, вам необходимо выполнить следующие шаги:

  1. Создать новый проект Android на базе библиотек Google API;
  2. Создать новый Android Virtual Device - c возможностью работы с Google API;
  3. Получить Map API Key;
  4. Подключить к проекту необходимые библиотеки и использовать классы Google Maps.


Шаг первый:

   Запустите Eclipse, создайте новый Android Project, можете назвать его HelloMap, и в поле Build Target  выберете Google APIs. Если у вас в Build Target нет Google APIs, значит у вас не установлен пакет с данным API. Пройдите Windows->Android SDK and AVD Manager->Installed Pakages, нажмите Update All... и установите пакет с Google API.

Шаг второй:

   Теперь нужно создать Android Virtual Device который имеет возможность работы с Google API. Пройдите Windows->Android SDK and AVD Manager->Virtual Devices. Нажмите New и в поле Target выберете Google APIs. Теперь можете запустите созданный эмулятор.

Шаг третий:

  Получение Map API Key. Для того чтобы иметь возможность отображать Google карты, вам необходимо использовать бесплатный Google Map API Key. Чтобы получить ключ необходимо выполнить следующие шаги:
  1. Найдите файл debug.keystore, он располагается в папке "C:\Documents and Settings\<User Name>\.android". Скопируйте данный файл в папку C:\(к примеру можете создать папку Android "C:\Android").
  2. Из данного keystore необходимо получить MD5 код. Для этого используйте утилиту keytool.exe которая поставляется вместе с JDK и располагается в папке "C:\Program Files\Java\<jdk using version>\bin".
  3. Запустите командную строку Пуск->Все программы->стандартные->командная строка. Перейдите в папку с keytool ("cd C:\Program Files\Java\<jdk uses version>\bin") и выполните следующую команду:
  4. keytool.exe -list -alias androiddebugkey -keystore "C:\android\debug.keystore" -storepass android -keypass android
    
    После выполнения данный команды вы должны увидеть на экране свой MD5 код.
  5. Скопируйте полученный MD5 и пройдите по ссылке http://code.google.com/intl/ru-RU/android/maps-api-signup.html. Следуйте инструкциям и получите свой API Key.



Шаг четвёртый:

   Для того чтобы использовать Google Maps API необходимо подключить библиотеку для работы с картами <uses-library android:name="com.google.android.maps"> и так как наше приложение будет загружать карты через интернет нужно позволить ему работать с интернетом INTERNET permission
   Откройте AndroidManifest.xml и добавьте в него <uses-library> и INTERNET permission:

    
        
            
                
                
            
        
 
 
    
      
    
    

 

Отображение карты.
   для того чтобы отобразить карты измените main.xml из папке res\layout. Вы должны использовать <com.google.android.maps.MapView> элемент, чтобы отобразить карту в вашем Activity.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent">
 
    <com.google.android.maps.MapView 
        android:id="@+id/mapView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:enabled="true"
        android:clickable="true"
        android:apiKey="Ваш API Key"
        />
 
</RelativeLayout>


   Теперь откройте HelloMap.Activity, данный класс должен быть унаследован от MapActivity. При наследовании от класса MapActivity необходимо переопределить метод isRoyteDisplayed():


package com.alukardev.hellomap2;

import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import android.os.Bundle;

public class HelloMapActivity extends MapActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

 @Override
 protected boolean isRouteDisplayed() {
  // TODO Auto-generated method stub
  return false;
 }
}


   Всё готово! Теперь можете запустить проект и посмотреть результат.


Масштабирование.
   Добавим в наш проект возможность масштабировать карту.
   Откройте main.xml и добавьте в него <LinearLayout>:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent">
 
    <com.google.android.maps.MapView 
        android:id="@+id/mapView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:enabled="true"
        android:clickable="true"
        android:apiKey="0oJHawmPUco4Y2eJDV8r5cKv4kUseLVglm4-e0g"
        />
        
        <LinearLayout android:id="@+id/zoom" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_alignParentBottom="true" 
        android:layout_centerHorizontal="true" 
        /> 
 
</RelativeLayout>
<LinearLayout> элемент нужен чтобы отобразить на нем кнопки масштабирования.

   Теперь откройте  HelloMapActivity.java. Импортируйте следующие библиотеки:

import com.google.android.maps.MapView.LayoutParams;  
import android.view.View;
import android.widget.LinearLayout;
   Добавьте следующий код после строчки  setContentView(R.layout.main);

mapView = (MapView) findViewById(R.id.mapView);
        LinearLayout zoomLayout = (LinearLayout)findViewById(R.id.zoom);  
        View zoomView = mapView.getZoomControls(); 
 
        zoomLayout.addView(zoomView, 
            new LinearLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, 
                LayoutParams.WRAP_CONTENT)); 
        mapView.displayZoomControls(true);

   Файл HelloMapActivity.java полностью:

package com.alukardev.hellomap2;

import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import android.os.Bundle;
import com.google.android.maps.MapView.LayoutParams;  
import android.view.View;
import android.widget.LinearLayout;

public class HelloMapActivity extends MapActivity 
{
 MapView mapView; 
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mapView = (MapView) findViewById(R.id.mapView);
        LinearLayout zoomLayout = (LinearLayout)findViewById(R.id.zoom);  
        View zoomView = mapView.getZoomControls(); 
 
        zoomLayout.addView(zoomView, 
            new LinearLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, 
                LayoutParams.WRAP_CONTENT)); 
        mapView.displayZoomControls(true);
    }

 @Override
 protected boolean isRouteDisplayed() {
  // TODO Auto-generated method stub
  return false;
 }
}

   Теперь можете запустить проект и посмотреть результат.


  В качестве альтернативного решения можно использовать клавиши для масштабирования, для этого нужно вызывать методы zoomIn() и zoouOut() класса MapController:
package com.alukardev.hellomap2;

import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import android.os.Bundle;
import com.google.android.maps.MapView.LayoutParams;  

import android.view.KeyEvent;
import android.view.View;
import android.widget.LinearLayout;

public class HelloMapActivity extends MapActivity 
{
 MapView mapView;
 
  public boolean onKeyDown(int keyCode, KeyEvent event) 
     {
         MapController mc = mapView.getController(); 
         switch (keyCode) 
         {
             case KeyEvent.KEYCODE_3:
                 mc.zoomIn();
                 break;
             case KeyEvent.KEYCODE_1:
                 mc.zoomOut();
                 break;
         }
         return super.onKeyDown(keyCode, event);
     }    
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mapView = (MapView) findViewById(R.id.mapView);
        LinearLayout zoomLayout = (LinearLayout)findViewById(R.id.zoom);  
        View zoomView = mapView.getZoomControls(); 
 
        zoomLayout.addView(zoomView, 
            new LinearLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, 
                LayoutParams.WRAP_CONTENT)); 
        mapView.displayZoomControls(true);
    }

 @Override
 protected boolean isRouteDisplayed() {
  // TODO Auto-generated method stub
  return false;
 }
}


8 комментариев:

  1. Полезно для новичка. Спасибо большое !!!

    ОтветитьУдалить
  2. Анонимный21 июля 2011 г., 17:20

    сделал один в один, но почему-то отображается не карта а пустые клетки

    ОтветитьУдалить
  3. Анонимный21 июля 2011 г., 18:04

    вот этого в манифесте не хватало

    ОтветитьУдалить
    Ответы
    1. Чего не хватало в манифесте?

      Удалить
  4. ооо, спасибо!!!

    Самые большие проблемы у меня вызвало генерация ключа - генерировал как-то по англ. туториалам - нигде такого как у тебя не встречал подхода.

    ОтветитьУдалить
  5. Уважаемый автор! Подскажите пожалуйста, как сделать так, чтобы при запуске программы открывалась локация, в которой находится девайс или виртуальная машита, с которой программа была запущена?

    ОтветитьУдалить
  6. У меня вообще ничего не отображается, выдаёт ошибку
    Installation error: INSTALL_FAILED_MISSING_SHARED_LIBRARY
    [2012-11-09 20:39:31 - MapActivity] Please check logcat output for more details.
    [2012-11-09 20:39:31 - MapActivity] Launch canceled!.
    Вот код манифеста:

















    Остальное сделано в точности по инструкции.
    ПОМОГИТЕ, ПОЖАЛУЙСТА!!!

    ОтветитьУдалить
  7. "Теперь откройте HelloMap.Activity, данный класс должен быть унаследован от MapActivity. При наследовании от класса MapActivity необходимо переопределить метод isRoyteDisplayed():"
    Не могу найти, помогите)

    ОтветитьУдалить