編輯:中級開發
本文節選於機械工業出版社推出的《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
簡介: 在這個由五個部分所組成的系列的第一部分中,您將接觸到移動 Web 應用程序中最流行的新技術:地理定位。高端智能手機都內置 GPS,現在您將了解 Web
簡介: 本文是共兩部分的系列文章 “android 和 iPhone 浏覽器之戰” 的第 2 部分,主要關注為 iPhone 和 Android 開發基於浏覽
可翻頁的產品細節屏幕為增強產品細節屏幕的可用性,我們定義了一個自定義視圖控制器(ProductScrollVIEwController 類)來支持用戶通過翻頁
兩位Google開發者演示了Android 3.0——該開源移動操作系統的首個支持平板設備的版本。Android 3.0也被稱為蜂巢(Honeycomb),這也是第一個