Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 中級開發 >> Android特色開發之Google Map和桌面組件(1)

Android特色開發之Google Map和桌面組件(1)

編輯:中級開發

本文節選於機械工業出版社推出的《Android應用開發揭秘》一書,作者為楊豐盛。本書內容全面,詳細講解了Android框架、android組件、用戶界面開發、游戲開發、數據存儲、多媒體開發和網絡開發等基礎知識,而且還深入闡述了傳感器、語音識別、桌面組件開發、Android游戲引擎設計、android應用優化、OpenGL等高級知識。另外,本書還全面介紹了如何利用原生的 C/C++(NDK)和Python、Lua等腳本語言(Android Scripting Environment)來開發Android應用,並以迭代的方式重現了各種常用的Android應用和經典android游戲的開發全過程。


第9章  android特色開發

android 是一個面向應用程序開發的豐富平台,它擁有許多具有吸引力的用戶界面元素、數據管理和網絡應用等優秀的功能。Android 還提供了很多頗具特色的接口。本章我們將分別介紹這些吸引開發者眼球的特色開發,主要包括:傳感器系統(Sensor)、語音識別技術(RecognizerIntent)、Google Map和用來開發桌面的插件(Widget)。通過本章的學習,讀者將對android有一個更深入的了解,可以開發出一些有特色、有創意的應用程序。

9.3  Google Map

提起Google Map(Google地圖),大家無不想到其姊妹產品Google Earth(Google地球)。全新的免費地圖服務讓Google在2005年震驚了整個互聯網界。此後,各大門戶紛紛推出自己的地圖服務,不少門戶還和Google一樣提供了二次開發的API。目前,基於地圖服務的各種應用已如雨後春筍般到處萌發了。當然,對於Google的android系統來說,地圖肯定也是必不可少的特色。

9.3.1  Google Map概述

Google Map是 Google 公司提供的電子地圖服務,包括局部詳細的衛星照片。它能提供三種視圖:一是矢量地圖(傳統地圖),可提供政區和交通以及商業信息;二是不同分辨率的衛星照片(俯視地圖,與Google Earth 上的衛星照片基本一樣);三是後來加上的地形視圖,可以用以顯示地形和等高線。它的姊妹產品是Google Earth——一個桌面應用程序,在三維模型上提供街景和更多的衛星視圖及GPS定位的功能。

Google公司於2004年11月收購了美國Keyhole公司,推出了http://maps.google.com,令人耳目一新。但Google 並未就此止步,在2005年6月底推出了桌面工具Google Earth,把“地球”放到了每個人的桌面上,讓你坐在電腦前,就可以在名川大山間漫步,在摩天樓群中俯瞰。

當然,隨著Google Map和Google Earth的誕生,也出現了很多非常有趣的應用,比如下面兩個典型的基於Google Earth和Google Maps的小游戲非常有創意,吸引了不少玩家。

如圖9-5所示,我們可以在全球任何地方甚至海底模擬開飛機或者潛水艇,來漫游整個世界,更多游戲請參見http://www.sea-seek.com/。

 

圖9-5  模擬飛行

如圖9-6所示,我們可以在地球上任何地方開著自己喜歡的車奔跑,非常有意思的是,可以在電腦面前開著車在自己周圍以及熟悉的地方模擬駕駛。詳細信息請參見http://geoquake.jp/en/webgame/DrivingSimulatorGM/。

 

圖9-6  模擬駕駛

 

類似的應用還有很多,這裡我們只介紹這兩款,有興趣的朋友可以自己去試試。現在Google Map已經被應用到很多手機上了,這更加方便了大家的生活。下面我們來看看手機上如何應用Google Map,如圖9-7所示。

 

圖9-7 Google Map 手機版

它包括如下功能:

·我的位置(測試版):“我的位置”在地圖上顯示你的當前位置(通常在 1000 米范圍之內)。即使沒有 GPS,你也可以確定自己的位置。谷歌手機地圖還支持內置 GPS,也可以鏈接到藍牙 GPS 傳感器,以便更准確地確定用戶的位置。“我的位置”功能是通過識別你附近無線發射塔的信息廣播而確定你的位置的。

·地圖和衛星視圖:谷歌手機地圖向你提供所查看地區的地圖和衛星視圖,其界面的使用感覺與你在台式機上相同。 可沿其中一個方向滾動,以查看地圖上的更多內容;或使用快捷鍵進行縮放。

·商戶列表:借助於 Google 的本地搜索引擎,可以按名稱(如“星巴克”)或類型(如“咖啡”)搜索商家,查看商店的營業時間和評分,然後,只需點擊一下即可撥通感興趣的商家的電話。有了“我的位置”功能,甚至都不需要輸入當前位置即可方便地找到附近的商家。

·駕車路線:可以很方便地獲得駕車路線,其中會清楚地標明每次轉彎。有了“我的位置”功能,甚至都不需要輸入出發點。

·公交換乘:查看公交和地鐵線路,確定轉車路線,制定你在全球 80 多個城市的出行計劃。“公交換乘”功能目前適用於黑莓、Windows Mobile、S60 和其他支持 Java 的手機。

·路況信息:Google 地圖中的公路會根據實時路況數據,以綠色、黃色或紅色顯示。

·收藏夾:為你常去的地方加上書簽,以便能在地圖上非常方便地返回到這些地方。

大家不要認為這些功能在手機上很難實現,尤其是在我們要學習的Android平台中,要實現這些功能是非常簡單的,只需要使用Android Maps API(地圖API)和android Location API(定位API)即可。下面我們將學習如何來使用這些API開發自己的地圖應用。

9.3.2  准備工作

在Android SDK?1.5預裝的add-on中提供了一個Map擴展庫com.google.android.maps,利用它就可以給android應用程序加上強大的地圖功能了。這個庫的位置是“Android SDK路徑”\add-ons\google_apis-3\libs。需要說明的是,這個庫並不是標准的Android sdk的內容,可以自己從這個位置下載,並放到你的sdk中,這樣就可以為你新建的應用或者已有的應用加上地圖功能了。在使用Android Map API之前,還需要申請一個android Map API Key。

1.申請android Map API Key

為了能順利地申請Android Map API Key,必須要准備Google的賬號和系統的證明書。一般Google發布Key都需要Google的賬號,Google的賬號是通用的,Gmail的賬號就可以了(沒有的話可以到http://www.google.com/去申請一個)。當一個應用程序發布時必須要證明書,證明書其實就是MD5。我們這裡不是發布,而只是為了測試,可以使用Debug版的證明書。下面我們來學習如何申請android Map API Key。

步驟1:找到你的debug.keystore文件。

證書的一般路徑為:C:\Documents and Settings\當前用戶\Local Settings\Application Data\ Android\debug.keystore。當然我們使用Eclipse開發,便可以打開Eclipse選擇 Windows→Preference→android→Build,其中Default debug keystore的值便是debug.keystore的路徑,如圖9-8所示。

 

圖9-8  debug.keystore文件的位置

步驟2:取得debug.keystore的MD5值。

首先在命令提示符下進入debug.keystore文件所在的路徑,執行命令:keytool -list -keystore debug.keystore,這時可能會提示你輸入密碼,這裡輸入默認的密碼“android”,即可取得MD5值,如圖9-9所示。

 

圖9-9  取得debug.keystore的MD5值

步驟3:申請android Map的API Key。

打開浏覽器,輸入網址:http://code.google.com/intl/zh-CN/android/maps-api- signup.Html,登錄Google賬號,在Google的android Map API Key申請頁面上輸入步驟2得到的MD5認證指紋,選中“I have read and agree with the terms and conditions”選項,如圖9-10所示,按下“Generate API Key”按鈕,即可得到我們申請到的API Key。

 

圖9-10  android Map API Key申請頁面

到這裡我們便完成了Android Map API Key的申請,記下申請的android Map API Key值,在後面的應用程序中會用到它。下面我們還將創建一個基於Google APIs的AVD。

2.創建基於Google APIs的AVD

在Eclipse中打開AVD管理界面,在“Create AVD”部分的Name處填寫AVD的名字,在Target處選擇“Google APIs-1.5”,如圖9-11所示,點擊“Create AVD”按鈕完成創建。

 

圖9-11  創建AVD

3.創建基於Google APIs的工程

這裡需要注意的是,由於我們需要使用Google APIs,所以在創建工程時,在Build Target處需要選擇Google APIs,如圖9-12所示,其他選項和以前一樣。當然,在運行工程時也就需要選擇我們剛剛創建的基於Google APIs的AVD來運行。

 

圖9-12  創建基於Google APIs的工程

到這裡,我們基本完成了准備工作,下面我們將開始學習如何使用Google API來開發地圖應用程序。

9.3.3  Google Map API的使用

Android中定義了一個名為com.google.android.maps的包,其中包含了一系列用於在Google Map上顯示、控制和層疊信息的功能類,以下是該包中最重要的幾個類:

·MapActivity:這個類是用於顯示Google Map的Activity類,它需要連接底層網絡。MapActivity是一個抽象類,任何想要顯示MapView的activity都需要派生自 MapActivity,並且在其派生類的onCreate()中,都要創建一個MapVIEw實例。

·MapView:MapView是用於顯示地圖的VIEw組件。它派生自android.view.ViewGroup。它必須和 MapActivity配合使用,而且只能被MapActivity創建,這是因為MapVIEw需要通過後台的線程來連接網絡或者文件系統,而這些線程要由MapActivity來管理。

·MapController:MapController用於控制地圖的移動、縮放等。

·Overlay:這是一個可顯示於地圖之上的可繪制的對象。

·GeoPoint:這是一個包含經緯度位置的對象。

下面我們將使用com.google.android.maps包來實現一個地圖浏覽程序(見本書所附代碼:第9章\Examples_09_03)。

步驟1:創建工程,注意要選擇的Build Target為“Google APIs”。

步驟2:修改androidManifest.XML文件。

由於我們要使用Google Map API,所以必須先在androidManifest.XML中定義如下信息:<uses-library android:name="com.google.android.maps"/>,當然要從網絡獲取地圖數據,還需要添加應用程序訪問網絡的權限。代碼如下:

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

步驟3:創建MapVIEw。

要顯示地圖,需要創建一個MapVIEw,在XML文件中的布局如代碼清單9-3所示。其中android:apiKey的值便是我們申請的android Map API Key。

     代碼清單9-3  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/MapVIEw01"

     android:layout_width="fill_parent"

     android:layout_height="fill_parent"

     android:apiKey="0dYpmIXGIdwiVm-HEpzuUW2fjNYsFQ9EvYir1sg"/>

     </RelativeLayout>

當然,可以在程序中通過如下代碼創建MapVIEw。

     MapView map = new MapVIEw(this, "[android Maps API Key]");    

步驟4:實現MapActivity。

MapView需要由MapActivity來管理,所以程序部分應該繼承自MapActivity類,必須實現isRouteDisplayed 方法。MapVIEw提供了3種模式的地圖,分別可以通過以下方式設置采用什麼模式來顯示地圖。另外,可以通過 setBuiltInZoomControls方法設置地圖是否支持縮放。

     //設置為交通模式

     //mMapVIEw.setTraffic(true);

     //設置為衛星模式

     //mMapVIEw.setSatellite(true);

     //設置為街景模式

     //mMapView.setStreetVIEw(false)  

步驟5:MapController的使用。

如果要設置地圖顯示的地點以及放大的倍數等,就需要使用MapController來控制地圖。可以通過如下代碼獲得MapController對象:

     mMapController = mMapVIEw.getController();  

要定位地點,需要構建一個GeoPoint來表示地點的經度和緯度,然後使用animateTo方法將地圖定位到指定的GeoPoint上,代碼如下:

     //設置起點為成都

     mGeoPoint=new GeoPoint((int)(30.659259*1000000),(int)(104.065762*1000000));

     //定位到成都

     mMapController.animateTo(mGeoPoint);   

步驟6:Overlay的使用。

如果需要在地圖上標注一些圖標文字等信息,就需要使用Overlay。這裡我們首先要將地圖上的經度和緯度轉換成屏幕上實際的坐標,才能將信息繪制上去。Map API中提供了Projection.toPixels(GeoPoint in, Point out)方法,可以將經度和緯度轉換成屏幕上的坐標。首先需要實現Overlay中的draw方法才能在地圖上繪制信息,代碼如下:

     class MyLocationOverlay extends Overlay

     {

     public boolean draw(Canvas canvas,MapView mapVIEw,boolean shadow,long when)

     {

     //...

     }

     }    

下面是示例運行效果,圖9-13以交通模式顯示地圖,圖9-14以衛星模式顯示地圖,它們都在屏幕上顯示了一個圖標,並標明了位置。

              

   圖9-13  交通模式地圖

                    

   圖9-14  衛星模式地圖

該示例顯示了成都市區的地圖,標注了天府廣場的大概位置,具體實現如代碼清單9-4所示。

     代碼清單9-4  第9章\Examples_09_03\src\com\yarin\android\Examples_09_03\Activity01.Java

     public class Activity01 extends MapActivity

     {

     private MapView mMapVIEw;

     private MapController mMapController;

     private GeoPoint mGeoPoint;

     public void onCreate(Bundle savedInstanceState)

     {

     super.onCreate(savedInstanceState);

     setContentVIEw(R.layout.main);

     mMapView = (MapView) findViewById(R.id.MapVIEw01);

     //設置為交通模式

     //mMapVIEw.setTraffic(true);

     //設置為衛星模式

     mMapVIEw.setSatellite(true);

     //設置為街景模式

     //mMapView.setStreetVIEw(false);

     //取得MapController對象(控制MapVIEw)

     mMapController = mMapVIEw.getController();

     mMapVIEw.setEnabled(true);

     mMapVIEw.setClickable(true);

     //設置地圖支持縮放

     mMapVIEw.setBuiltInZoomControls(true);

     //設置起點為成都

     mGeoPoint=new GeoPoint((int)(30.659259*1000000),(int)(104.065762*1000000));

     //定位到成都

     mMapController.animateTo(mGeoPoint);

     //設置倍數(1-21)

     mMapController.setZoom(12);

     //添加Overlay,用於顯示標注信息

             MyLocationOverlay myLocationOverlay = new MyLocationOverlay();

             List<Overlay> list = mMapVIEw.getOverlays();

             list.add(myLocationOverlay);

     }

     protected boolean isRouteDisplayed()

     {

     return false;

     }

     class MyLocationOverlay extends Overlay

     {

     public boolean draw(Canvas canvas,MapView mapVIEw,boolean shadow,long when)

     {

     super.draw(canvas, mapVIEw, shadow);

     Paint paint = new Paint();

     Point myScreenCoords = new Point();

     // 將經緯度轉換成實際屏幕坐標

     mapVIEw.getProjection().toPixels(mGeoPoint,myScreenCoords);

     paint.setStrokeWidth(1);

     paint.setARGB(255, 255, 0, 0);

     paint.setStyle(Paint.Style.STROKE);

     Bitmap bmp = BitmapFactory.decodeResource(getResources(),

     R.drawable.home);

     canvas.drawBitmap(bmp,myScreenCoords.x,myScreenCoords.y,paint);

     canvas.drawText("天府廣場",myScreenCoords.x, myScreenCoords.y,

     paint);

     return true;

     }

     }

     }

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.Net/L_serein/archive/2011/01/07/6122116.ASPx

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