開發Google地圖應用程式

來源:互聯網
上載者:User
基於地圖的應用程式開發是針對新款行動裝置必須擁有的功能之一。為了開發Android中基於地圖的應用程式,Google已經提供了地圖庫作為附加功能。本文闡述了地圖庫以及如何開發Android中基於

關於本文

基於地圖的應用程式開發是針對新款行動裝置必須擁有的功能之一。為了開發Android中基於地圖的應用程式,Google已經提供了地圖庫作為附加功能。本文闡述了地圖庫以及如何開發Android中基於Google地圖的應用程式的相關內容。

範圍:

本文為希望簡單瞭解Android編程的初學者而設計。並將逐步指導使用者您開發Google地圖應用程式。本文假定開發人員已安裝了Android和必要的應用程式開發工具。同樣假定開發人員熟悉Java或熟悉物件導向的編程概念。

如欲擷取更多有關Android的詳情,請參閱三星移動創新者園地(SMI)的知識庫。

http://innovator.samsungmobile.com/cn/cms/cnts/knowledge.list.do?platformId=1    

簡介

Android提供了Google外部地圖庫“com.google.android.maps”作為附加功能,以開發基於Google API的應用程式。該地圖庫提供了內建的地圖下載、渲染和地圖圖片緩衝以及各種顯示選項和控制項。

本文假定您使用者當前正在使用Eclipse IDE和已經加入其中的Android外掛程式來開發應用程式。

安裝Google API

開始開發Google地圖應用程式之前,請確認您您已在Android SDK中安裝了Google API外掛程式。

外部地圖庫未包括在SDK中所提供的標準Android庫中。Google API附加工具提供了地圖庫,從而可開發、建立並運行Android SDK中基於地圖的應用程式。

如欲查看Google API是否已添加入Android SDK中,開啟圖1中所示的Android SDK和AVD管理器。

如果Google API尚未安裝,則需手動對其進行安裝。

選擇“Installed Options(已安裝選項)”部分,以查看已經安裝的內容,並選擇“Available Packages(可用包)”來下載附加的API.

圖2顯示了Google API已添加至Android SDK中。

建立項目

滿足所有必要條件之後,開始開發應用程式。

首先在Eclipse IDE中建立Google地圖項目,3中所示。給定所需的項目名稱,並選擇所希望的目標為Google API。使用“Google API”作為目標非常重要,因為該選項包括了可允許您使用Google地圖的Google擴充件。

如果您您無法查看Google API選項,則需根據安裝Google API部分的描述來進行安裝。

建立帶有Google API的AVD

建立項目後,您需建立可支援Google API的裝置。

開啟Android SDK和AVD管理器,1所示。選擇“Virtual devices(虛擬設備)”。點擊“New(建立)”按鈕,建立AVD。將出現4所示的對話方塊。

指定AVD的名稱,並選擇“Google API(Google公司)”目標中的其中之一。配置其他選項,然後點擊“Create AVD(建立AVD)”。可運行該項目的新AVD已經建立。

擷取Google API註冊碼

Google地圖庫提供了渲染地圖的Google地圖資料。由於應用程式將訪問Google資料,因此開發人員需註冊Google網路服務。

Google地圖API註冊碼要求允許Google API可相應訪問能夠提供地圖資料的網路服務。

註冊擷取一個簡單、免費的地圖API註冊碼,其包括兩部分:

1. 提取認證的MD5fingerprint。

2. 註冊認證的MD5fingerprint。

提取MD5fingerprint 認證

如欲獲註冊擷取一個地圖API註冊碼,開發人員需提供MD5fingerprint 認證,這可使其用來簽署應用程式。此處我們需要使用兩種應用程式。

debug.keystore

預設情況下,構建工具預設在已啟用的AVD目錄中建立調試keystore。不同的平台,AVD目錄的位置也不同:

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

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

- OS X和Linux: ~/.android/debug.keystorekeytool.exe

keytool.exe

您需使用隨JDK安裝所包含的keytool.exe應用程式來提取MD5fingerprint。該fingerprint需申請免費的Google地圖註冊碼。該keytool.exe檔案通常出現在Windows的%JAVA_HOME%/bin目錄或Linux/OS X的$JAVA_HOME/bin目錄中。

由於我們當前正在偵錯模式下開發和調試應用程式,因此我們需在偵錯模式下籤署應用程式,即SDK構建工具將自動使用調試認證簽署您的應用程式。

如欲進入該應用程式,我們需提取MD5fingerprint認證,並且為此目的需要使用debug.keystore檔案。如果您無法尋找debug.keystore檔案,則可選擇Eclipse IDE中的Windows> Preferences > Android > Build來檢查路徑。圖5顯示了Eclipse IDE中的debug.keystore路徑.

一旦您已尋找到keystore,則使用此Keytool命令來擷取調試認證的MD5fingerprint。

$ keytool -list -alias androiddebugkey -keystore .keystore -storepass android -keypass android

例如: $ keytool -list -alias androiddebugkey -keystore "C:\android\debug.keystore” -storepass android -keypass android

註冊認證的MD5fingerprint

keytool的輸出類似於圖6中所示的情況。

複製MD5認證,並開啟網頁瀏覽器至http://code.google.com/android/maps-api-signup.html。

7中所示,同意Google API的條款及條件,並輸入該認證的MD5fingerprint。

點擊“Generate API Key(產生API註冊碼)”按鈕,以產生API註冊碼。所產生的API註冊碼8中所示。

修改AndroidManifest.xml

現在訪問應用程式中的Google地圖,開發人員需要通過以下操作來修改AndroidManifest.xml檔案。

添加許可

您需要使用標記元素來添加網路許可,要求的許可如下:

- android.permission.ACCESS_COARSE_LOCATION

- android.permission.ACCESS_FINE_LOCATION - android.permission.INTERNET

添加庫

您需要使用標記元素來添加Google地圖庫。這是因為Google地圖庫並非是該標準庫的完整部分。

最終的AndroidManifest.xml檔案9中所示。

正如您所見,其放置於該元素以及該元素內部中元素的外部。

修改main.xml

現在開啟該項目的res\layout檔案夾中出現的main.xml檔案。開發人員需要使用該元素來顯示您的活動中的Google地圖。使用元素來定位活動範圍內的地圖。

已修改的main.xml10中所示。

 

正如您所見,該Google地圖API註冊碼已在main.xml檔案中輸入。

建立GoogleMap Activity

通過擴充MapActivity類而非Activity類來實現在應用程式中渲染地圖。

MapActivity實際上是一種具有代碼的基類,可管理能夠顯示MapView的任何一個Activity的繁瑣事務。Activity的責任包括:

- Activity生命週期管理

- 為MapView類建立和撤銷服務

為了從MapActivity進行擴充,我們必須執行isRouteDisplayed方法,該方法表示是否顯示任何種類的路線資訊,如交通、衛星、街道視圖資訊。我們將不會提供此類資訊,因此這裡我們僅能返回false。

請在繼續之前查看Google地圖API文檔。該GoogleMap類11中所示。

部署應用程式

如欲在模擬器上部署應用程式,按下Eclipse IDE中的F11。該輸出12中所示。

如您所見,該地圖已在應用程式中予以渲染,並且可添加內建的縮放控制項來縮放地圖。

變更地圖視圖

在預設的情況下,Google地圖將在地圖模式下予以顯示。如果您希望在衛星視圖中顯示該地圖,則可使用MapView類的setSatellite()方法來實現,如下:

mapView.setSatellite(true);

您還可使用setStreetView()方法在街道視圖中顯示該地圖。

mapView.setStreetView(true);

圖13分別展示了衛星和街道視圖中顯示的Google地圖。

顯示特別的位置

在預設的情況下,Google地圖首次載入時即可顯示美國的地圖。但是,您也可設定Google地圖來顯示一個特別的位置。在此情況下,您可使用MapController類的animateTo()方法。

14中所示,擷取了來自MapView的一個MapController。然後,使用GeoPoint對象來表示一個地理位置。GeoPoint類位置的經緯度以微米度數(儲存為整數值)來表示。

如欲將地圖導航移至一個特別的位置,我們需要使用MapController類的animateTo()方法和setzoom()方法來設定縮放比例。

該輸出15中所示。此GeoPoint座標表示墨西哥城。

添加Overlay項目

迄今為止,我們已看到了地圖,但是您可能希望建立並添加標誌和停留點至地圖中,從而顯示名勝之地。

目前我們將添加標誌至地圖中。首先,我們需要顯示標誌的圖片。複製圖16,並將其添加至該項目的res/drawable檔案夾中。17所示。

您首先需要定義一個可擴充Overlay類的類,以便添加標誌至地圖中:

在您必須加以定義的MapOverlay類中,重載draw()方法以便可在地圖中繪製圖釘圖片。特別注意需要將地理位置(通過GeoPoint對象p來表示)轉換成螢幕座標。

添加標誌的方法為: 建立MapOverlap類樣本,並將MapOverlap類樣本添加至MapView對象可用的overlays列表中。圖18顯示了最終代碼。

該輸出19中所示。

GoogleMap應用程式

以下顯示了GoogleMap專案檔 

main.xml

<?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="YOUR API KEY HERE"/>       

</RelativeLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

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

      package="com.samsung.maps.google"

      android:versionCode="1"

      android:versionName="1.0">   

      <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8" android:maxSdkVersion="8" />             

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

      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">     

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

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

          <activity android:name=".GoogleMap"  android:label="@string/app_name">

            <intent-filter>

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

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

            </intent-filter>

        </activity>

      </application>

</manifest>

GoogleMap.java

package com.samsung.maps.google;import java.util.List;import android.content.Context;import android.content.res.Resources;import android.os.Bundle;import com.google.android.maps.MapActivity;import com.google.android.maps.GeoPoint;import com.google.android.maps.MapController;import com.google.android.maps.MapView;import com.google.android.maps.Overlay;public class GoogleMap extends MapActivity  {  MapView mapView; MapController mc; GeoPoint p; Resources res; Context context; MapOverlay mapOverlay;  /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState)   {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);               res = getResources();        context = getApplicationContext();               mapView = (MapView) findViewById(R.id.mapView);        mapView.setBuiltInZoomControls(true);        mc = mapView.getController();        p = new GeoPoint(19240000,-99120000);                      mc.animateTo(p);        mc.setZoom(8);                //Add location marker        //MapOverlay mapOverlay = new MapOverlay();        mapOverlay = new MapOverlay(p, res, context);        List listOfOverlays = mapView.getOverlays();        listOfOverlays.clear();        listOfOverlays.add(mapOverlay);                mapView.invalidate();    }     @Override    protected boolean isRouteDisplayed() {        return false;    }}

MapOverlay.java

package com.samsung.maps.google;import android.content.Context;import android.content.res.Resources;import com.google.android.maps.Overlay;import android.app.AlertDialog;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Point;import com.google.android.maps.GeoPoint;import com.google.android.maps.MapView;public class MapOverlay extends Overlay {  Resources res; Context context; GeoPoint geoPoint; public MapOverlay(GeoPoint g, Resources r, Context c) {  super();  res = r;  context = c;  geoPoint = g; } @Overridepublic boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when)   {        super.draw(canvas, mapView, shadow);                            //translate the GeoPoint to screen pixels        Point screenPts = new Point();        mapView.getProjection().toPixels(geoPoint, screenPts);         //add marker        Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.androidmarker);                   canvas.drawBitmap(bmp, screenPts.x, screenPts.y-58, null);                return true;    }       @Override    public boolean onTap(GeoPoint p, MapView mapView) {                AlertDialog.Builder dialog = new AlertDialog.Builder(context);

      dialog.setTitle("Hi");

      dialog.setMessage("Hi Im in Mexico");

      dialog.show();

      return true;

    }

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.