Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 初級開發 >> 一步步教你用Android Google Map

一步步教你用Android Google Map

編輯:初級開發

Android操作系統平台很容易跟Google其他應用如Google地圖的整合。在Android應用中,如果能在其中加入Google地圖,則會為你的應用增添強大的功能,目前不少LBS應用(基於地理位置的應用)就是充分將移動跟地圖結合起來。在本文中,將一步步教你如何將Google地圖結合到你的android應用中。  

  第一步: 安裝Google Map API

  在默認情況下,在安裝Google Android SDK時,是不需要必須安裝Google Map API的。但要做Map應用的話,就必須安裝Google Map API。我們可以通過啟動android SDK and AVD Manager這個SDK管理器去下載安裝Google Map API。在啟動SDK管理器後,選擇“Installed Options”,去查看你已經安裝了哪些SDK和是否已經安裝Google Map API,如果尚未安裝的話,可以在“Available Packages”中查找並下載安裝,如下圖所示:

  

  · Windows Vista: C:\Users\\.android\debug.keystore

  · Windows XP: C:\Documents and Settings\\.android\debug.keystore

  · OS X and Linux: ~/.android/debug.keystore

  接下來,我們開始使用keytool工具產生md5密紋,命令行下輸入如下語句:

   %Java_HOME%/bin/keytool -list -alias androiddebugkey -keystore debug.keystore -storepass android -keypass android

  現在我們就產生了debug模式下的MD5密紋了,要注意的是,你必須重新為生產環境下的應用重新生成一次MD5密紋,因為如果在不同的android SDK或者不同的開發環境下,MD5密紋是不同的,否則換了環境的話Google Map將不會工作。

  產生的MD5密紋的輸出如下面:

  

  androiddebugkey, Apr 2, 2010, PrivateKeyEntry,

  Certificate fingerprint (MD5): 72:BF:25:C1:AF:4C:C1:2F:34:D9:B1:90:35:XX:XX:XX

  接下來,我們要到Google Map API的主頁去申請一個Map的key了,可以訪問

  http://code.google.com/android/maps-api-signup.Html頁面,在其中的MD5 fingerprint一欄中輸入剛才生成的MD5密紋,如下圖:

  輸入後,點Generate API Key,之後會為我們產生Google Map API了,如下圖,這個API是我們在程序中可以使用的。

  

  其中還給出了如何在android中使用該API的方法。

  第四步:開始創建android Google Map應用

  其實,編寫android Map應用並不復雜,只需要繼承MapActivity類就可以了。MapVIEw這個類功能是從Google Map地圖中獲得數據並且展示地圖。MapActivity的主要功能有:

  1) 管理Activity的生命周期

  2) 為MapVIEw類建立和撤消相關的服務。

  在繼承了MapActivity類後,我們要實現其中的isRouteDisplayed方法,這個方法其實是用來表示我們是否顯示一些路線的信息,這個通常用在地圖的飛行模式時才使用,這裡我們不提供任何信息僅是返回false即可。

  在我們的activity中,我們將引用到MapVIEw,它是在界面XML中定義的。同時我們也用到setBuiltInZoomControls方法設置地圖允許縮放模式。

  初步的代碼是這樣的:

  

  package com.Javacodegeeks.android.googlemaps;

  import android.os.Bundle;

  import com.google.android.maps.MapActivity;

  import com.google.android.maps.MapVIEw;

  public class GMapsActivity extends MapActivity {

  private MapView mapVIEw;

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentVIEw(R.layout.main);

  mapView = (MapView) findViewById(R.id.map_vIEw);

  mapVIEw.setBuiltInZoomControls(true);

  }

  @Override

  protected boolean isRouteDisplayed() {

  return false;

  }

  }

  而相應的界面XML文件如下:

  <?XML version="1.0" encoding=""?>

  <RelativeLayout

  XMLns:android="http://schemas.android.com/apk/res/android"

  android:orIEntation="vertical"

  android:layout_ width="fill_parent"

  android:layout_border="1" height="fill_parent">

  <com.google.android.maps.MapVIEw

  XMLns:android="http://schemas.android.com/apk/res/android"

  android:id="@+id/map_vIEw"

  android:layout_ width="fill_parent"

  android:layout_border="1" height="fill_parent"

  android:clickable="true"

  android:enabled="true"

  android:apiKey="API-KEY-HERE" />

  </RelativeLayout>

  注意,其中要把你獲得的Google Map的API KEY寫到MapVIEw控件中去。最後,記得在androidManifest.XML配置文件中,加上對Internet和Map的使用訪問權限,其中由於Google Map的API是另外提供的API,因此也需要使用use-library標簽進行說明,如下代碼所示。

  

  <?XML version="1.0" encoding=""?>

  <manifest XMLns:android="http://schemas.android.com/apk/res/android"

  package="com.Javacodegeeks.android.googlemaps"

  android:versionCode="1"

  android:versionName="1.0">

  <application android:icon="@drawable/icon" android:label="@string/app_name">

  <activity android:name=".GMapsActivity"

  android:label="@string/app_name">

  <intent-filter>

  <action android:name="android.intent.action.MAIN" />

  <category android:name="android.intent.category.LAUNCHER" />

  </intent-filter>

  </activity>

  <uses-library android:name="com.google.android.maps" />

  </application>

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

  </manifest>

  運行程序,可以得到一個初步的地圖,如下圖所示:

  

  第五步:自定義地圖的圖層

  接下來,我們需要為地圖多增加一些自定義的功能,比如可以在地圖上進行一些標注。為了實現這樣的功能,我們可以繼承Overlay這個類,這個類是一個基類,提供了可以在地圖上添加圖層的基本功能。而另外的選擇是,我們可以繼承itemzedOverlay這個類,

  它提供了一種快捷的方法,可以把標記圖片和相關的文本分配給特定的地理位置。ItemizedOverlay實例可以處理每一個OverlayItem(OverlayItem可以簡單理解為在地圖上的每一個標記)標記的繪制、放置、單擊處理、焦點控制和布局優化。下面我們看代碼:

  

  package com.Javacodegeeks.android.googlemaps;

  import Java.util.ArrayList;

  import android.app.AlertDialog;

  import android.content.Context;

  import android.graphics.drawable.Drawable;

  import com.google.android.maps.ItemizedOverlay;

  import com.google.android.maps.OverlayItem;

  public class CustomItemizedOverlay extends ItemizedOverlay<OverlayItem> {

  private ArrayList<OverlayItem> mapOverlays = new ArrayList<OverlayItem>();

  private Context context;

  public CustomItemizedOverlay(Drawable defaultMarker) {

  super(boundCenterBottom(defaultMarker));

  }

  public CustomItemizedOverlay(Drawable defaultMarker, Context context) {

  this(defaultMarker);

  this.context = context;

  }

  @Override

  protected OverlayItem createItem(int i) {

  return mapOverlays.get(i);

  }

  @Override

  public int size() {

  return mapOverlays.size();

  }

  @Override

  protected boolean onTap(int index) {

  OverlayItem item = mapOverlays.get(index);

  AlertDialog.Builder dialog = new AlertDialog.Builder(context);

  dialog.setTitle(item.getTitle());

  dialog.setMessage(item.getSnippet());

  dialog.show();

  return true;

  }

  public void addOverlay(OverlayItem overlay) {

  mapOverlays.add(overlay);

  this.populate();

  }

  }

  在這個類中,需要在構造函數中使用Drawable類,這將被用作來繪制一個標記。此外,我們使用ArrayList去保存所有的Overlayitems,而createitem和size方法則容易理解了,分別是返回每一個Overlayitem和返回目前的所有標記的數目。而onTap方法則是在當某個標記在地圖上真正標注時所觸發的,比如當在觸摸屏上點擊時,也可以觸發該事件。在這個例子中,我們只是通過彈出對話框的方法展示給用戶看。最後,在addOverlay方法中,我們向標記數組mapOverlays中增加一個overlayitem標記,並且調用populate方法將其展示出來。

  接下來我們看下如何使用上面的這個類,將代碼修改如下:

  

  package com.Javacodegeeks.android.googlemaps;

  import Java.util.List;

  import android.graphics.drawable.Drawable;

  import android.os.Bundle;

  import com.google.android.maps.GeoPoint;

  import com.google.android.maps.MapActivity;

  import com.google.android.maps.MapController;

  import com.google.android.maps.MapVIEw;

  import com.google.android.maps.Overlay;

  import com.google.android.maps.OverlayItem;

  public class GMapsActivity extends MapActivity {

  private MapView mapVIEw;

  private static final int latitudeE6 = 37985339;

  private static final int longitudeE6 = 23716735;

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentVIEw(R.layout.main);

  mapView = (MapView) findViewById(R.id.map_vIEw);

  mapVIEw.setBuiltInZoomControls(true);

  List<OVERLAY> mapOverlays = mapVIEw.getOverlays();

  Drawable drawable = this.getResources().getDrawable(R.drawable.icon);

  CustomItemizedOverlay itemizedOverlay =

  new CustomItemizedOverlay(drawable, this);

  GeoPoint point = new GeoPoint(latitudeE6, longitudeE6);

  OverlayItem overlayitem =

  new OverlayItem(point, "Hello", "I"m in Athens, Greece!");

  itemizedOverlay.addOverlay(overlayitem);

  mapOverlays.add(itemizedOverlay);

  MapController mapController = mapVIEw.getController();

  mapController.animateTo(point);

  mapController.setZoom(6);

  }

  @Override

  protected boolean isRouteDisplayed() {

  return false;

  }

  }

  在上面的代碼中,我們實例化了CustomItemizedOverlay類,並為其構造函數傳入了android默認的Drawable類的實例進行初始化,接下來,我們用一個預先定義好的經緯度去實例化一個GeoPoint類,GeoPoint類表示一個具體的位置。然後再用這個geopoint類的實例去初始化OverlayItem對象的實例,並且傳入一段文本,這樣就產生了一個完整的地圖上的標記了,最後把這個標記加入到圖層中去,這是通過調用CustomItemizedOverlay類的addOverlay去實現的,最後該標記就會出現在地圖上了。

  最後,我們調用了MapController這個工具類去控制地圖的縮放,將地圖縮放到由

  GeoPoint類的實例指定區域的位置(使用的是animateTo方法),並用setZoom()方法指定了放大的級別。

  運行程序後,可以看到在地圖上只顯示了指定區域大小的地圖,並且看到了標記,當你點擊標記時,可以看到彈出的對話框和顯示的文字。

  

  總結

  其實Android 搭配Google Map還能實現很多功能,比如GPS導航,結合SNS實現提供各類的LBS位置服務等,本文只是帶領你初窺了android 搭配Google Map的強大功能,更多的還有待讀者去實踐發現。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved