国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Google Android平臺的應(yīng)用程序開發(fā)與研究

2009-12-31 00:00:00張仕成
電腦知識與技術(shù) 2009年28期

(同濟大學(xué) 軟件學(xué)院,上海 201804)

摘要:由Google倡導(dǎo)發(fā)起的開放手機聯(lián)盟及其推出的Android平臺,一經(jīng)發(fā)布便在業(yè)內(nèi)引起軒然大波。首先介紹了android平臺中的內(nèi)部結(jié)構(gòu),并通過和現(xiàn)有的智能手機開發(fā)平臺進行比較研究分析了該平臺的結(jié)構(gòu)特點,以此來說明android平臺具有強大的開放性和兼容性。然后重點介紹了該平臺強大的功能之一——Google Map,通過開發(fā)一個利用地理定位服務(wù)來獲取當(dāng)前設(shè)備地理位置的應(yīng)用實例,并詳細(xì)地介紹了Google Map中豐富的API功能以及應(yīng)用程序的基本開發(fā)流程,來驗證Android SDK提供的強大的技術(shù)支持。

關(guān)鍵詞:Android;智能手機平臺;應(yīng)用程序;Google Map;Geocode

中圖分類號:TP18文獻標(biāo)識碼:A文章編號:1009-3044(2009)28-7959-04

Development and Research of Application Based on Google Android

ZHANG Shi-Cheng

(Software College, Tongji University, Shanghai 201804, China)

Abstract: The establishment of OHA(Open Handset Alliance) and the publication of Android platform by Google have caused uproar in communication industry.This paper firstly introduced and analysed characteristics of this platform by compared with others,to explain that this platform has the formidable openness and the compatibility.Then it introduced the applicationinterfaces of Google Map,and the basic development procedure of a application,which used a location service to gain the geographical position of the current equipment,to verify the formidable technical support which the android sdk provides.

Key words: Android; smart phone platform; application; Google Map; Geocode

2007年11月由Google牽頭有30多家移動技術(shù)和無線應(yīng)用領(lǐng)域領(lǐng)先企業(yè)組成的開放手機聯(lián)盟(Open Handset Alliance)發(fā)布了其智能手機平臺--Android。Android是一個開放、自由的移動終端平臺,它是由操作系統(tǒng)、中間件、用戶界面、應(yīng)用軟件組成,同時其開放性保證該平臺不存在任何阻礙移動產(chǎn)業(yè)創(chuàng)新的專有權(quán)障礙。開發(fā)人員在該平臺開發(fā)的應(yīng)用程序,是使用Java語言編寫的、在Dalvik虛擬機上運行的。Android的底層是以開放性的Linux kernel為其架構(gòu),也可以理解為Google推出的手機操作系統(tǒng)和相關(guān)軟件的總稱。

1 Android平臺的架構(gòu)

Android平臺整體自底向上由以下四個層次組成:Linux內(nèi)核層、Android運行時庫和其他庫層、應(yīng)用框架層、應(yīng)用程序?qū)印?/p>

1) Linux內(nèi)核層:Android基于Linux version2.6.23內(nèi)核開發(fā)的,主要是添加了一個名為Goldfish的虛擬CPU以及Android運行所需的特定驅(qū)動代碼。該層用來提供系統(tǒng)的底層服務(wù),包括安全機制、內(nèi)存管理、進程管理、網(wǎng)絡(luò)堆棧及一系列的驅(qū)動模塊。作為一虛擬的中間層,該層位于硬件與其它的軟件層之間。需要注意的是,這個內(nèi)核操作系統(tǒng)并非類GNU/Linux的,所以其系統(tǒng)庫、系統(tǒng)初始化和編程接口都和標(biāo)準(zhǔn)Linux系統(tǒng)有所不同的。它沒有采用虛擬內(nèi)存文件系統(tǒng)。而是采用YAFFS2文件系統(tǒng)。YAFFS(Yet Another Flash File System)文件系統(tǒng)是一個開源的,專門為NAND Flash設(shè)計的文件系統(tǒng),具有很好的可移植性,也是一種日志型文件系統(tǒng),能夠在Linux,uCLinux.和Windows CE上運行。YAFFS目前有YAFFS和YAFFS2兩個版本,一般來說,YAFFS對小頁面(528字節(jié)/頁)有很好的支持,而更大的頁面(2K+64字節(jié)/頁)就需要支持超大容量的NAND Flash。所以采用支持大頁面的YAFFS2文件系統(tǒng)。

2) Android運行時庫和其他庫層:Android 運行時庫包含一組核心庫(提供了Java語言核心庫內(nèi)的大部分功能)和Dalvik虛擬機。同時Android提供了豐富的庫類支持且大部分為開源代碼,如采用的數(shù)據(jù)庫為SQLite。Android選擇它作為移動終端的嵌入式數(shù)據(jù)庫有以下優(yōu)點,它無需安裝和管理配置,它是一個存儲在單一磁盤文件中的完整的數(shù)據(jù)庫,體積小只有250KB但支持?jǐn)?shù)據(jù)庫大小至2TB,提供了對事務(wù)功能和并發(fā)處理的支持,而且比目前流行的大多數(shù)數(shù)據(jù)庫運行速度快。

3) 應(yīng)用框架層:在應(yīng)用框架Android開發(fā)人員可以跟那些核心應(yīng)用一樣擁有訪問框架APIs的全部權(quán)限。應(yīng)用的系結(jié)構(gòu)化設(shè)計簡化了各組件之間的重用,任何應(yīng)用都可以分發(fā)自己的足見,任何應(yīng)用也可以使用這些分發(fā)的組件(應(yīng)用的使用方法需遵循框架的安全性約束)。

4) 應(yīng)用程序?qū)?Android本身會附帶一些核心的應(yīng)用程序,包括e-mail客戶端、短信程序、日歷、地圖、瀏覽器、通訊錄等等,目前所有的應(yīng)用程序都是由Java語言開發(fā)的。

2 Android平臺與J2ME的區(qū)別

J2ME是Java語言專門針對嵌入式電子產(chǎn)品開發(fā)的版本,應(yīng)用在移動電話、PDA、電視機機頂盒以及其它資源受限的設(shè)備上,J2ME是目前移動設(shè)備上使用最廣泛的開發(fā)平臺.J2ME平臺由多種配置、簡表和可選包組成.

可以發(fā)現(xiàn)J2ME的應(yīng)用是建立在JVM(或KVM)之上,而主機操作系統(tǒng)是位于J2ME平臺之外.這樣的設(shè)計一方面提供了跨操作系統(tǒng)的特性,主機操作系統(tǒng)可以是Symbian、Windows Mobile和Linux,另一方面J2ME雖然提供了統(tǒng)一的開發(fā)平臺,但是JVM的安全機制讓J2ME的應(yīng)用程序不能調(diào)用本地系統(tǒng)資源.而Android向下既包括操作系統(tǒng)內(nèi)核心,向上又擁有通現(xiàn)成的應(yīng)用軟件,加之開源、免費、可以直接使用Java語言為開發(fā)人員提供了極大的便利。

另外需要強調(diào)的是雖然同樣是使用Java語言進行開發(fā),但是Android使用的Dalvik虛擬機和J2ME使用的標(biāo)準(zhǔn)的Java虛擬機(JVM)存在以下區(qū)別:

1) Dalvik是基于寄存器,而JVM是基于堆棧的.Android選擇采用寄存器的方式是因為它對提前優(yōu)化(ahead-of-time optimization)提供了更好的支持,而這對類似于移動電話這樣的受限環(huán)境是頗有裨益的.針對基于寄存器虛擬機和基于堆棧的虛擬機更深入的比較分析指出,基于寄存器的虛擬機對于更大的程序來說,在它們編譯時花費的時間更短.

2) 運行環(huán)境的區(qū)別.Dalvik經(jīng)過優(yōu)化,允許在有限的內(nèi)存中同時運行多個虛擬機的實例.

3 Android平臺應(yīng)用程序開發(fā)例程

開發(fā)實例是一個Android平臺上地理定位應(yīng)用程序,該應(yīng)用是利用Android平臺上的Google Map中的API來獲取當(dāng)前設(shè)備的地理位置,可以定時地請求更新設(shè)備當(dāng)前的地理位置信息。

Android提供的地圖(Map)功能可能是廣大開發(fā)者非常關(guān)心的一部分。到目前為止,開發(fā)內(nèi)嵌式地圖應(yīng)用的軟件相當(dāng)?shù)睦щy,而且往往還需要支付很高的地圖廠商的版權(quán)費用,加之手機上GPS功能還不完善,導(dǎo)致很多可以基于當(dāng)前位置來開發(fā)功能的軟件少之又少,就算是幾個比較著名的LBS(Location-Based Service)軟件,使用者也是寥寥無幾。Android的出現(xiàn)打破這一格局,提供給普通開發(fā)者非常靈活的地圖展示與控制功能。

3.1 相關(guān)地理知識的簡介

在詳細(xì)進入coding之前,我們先介紹下經(jīng)緯度知識。

經(jīng)度是地球上一個地點離一根被稱為本初子午線的南北方向走線以東或者以西的度數(shù),本初子午線的經(jīng)度是0度,地球上其它地點的經(jīng)度是向東到180度或者向西到180度。

緯度是指某點與地球球心的連線赤道面所成的線面角,其數(shù)值在0至90度之間,位于遲到以北的點的緯度叫北緯,記為N,位于赤道以南的點的緯度稱南緯,記為S。

所謂地圖投影,就是在平面上建立與地球曲面上相對應(yīng)的經(jīng)緯網(wǎng)的方法。地圖投影的擬定和計算,一般均假定地球表面為旋轉(zhuǎn)橢球面或參考橢球面。

3.2Google Map中的API

使用geocode,地球上任何一個地點都可以用精度+緯度來代表。在Android中,com.google.android.maps.GeoPoint這個類代表了一個地點的經(jīng)緯度;GeoPoint(int latitudeE6,int longitudeE6),E6是緯度(microdegrees).就是度數(shù)再乘以1000000。目前如果要指定地圖地點,一定要傳遞一個Point的類到地圖中。

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

MapActivity:這個類是用語顯示Google Map的Activity類,它需要連接底層網(wǎng)絡(luò)。

MapView: MapView是用于顯示地圖的View組件。它可以獲取鍵盤事件(onKeyDown和onKeyUp)來支持地圖移動和縮放功能。它還支持多層Overlay,可以在地圖上面畫坐標(biāo),寫地名,畫圖片等等,MapView 必須和MapActivity配合使用。另外,MapView還提供了衛(wèi)星圖、交通圖和路況圖3種模式功能。

MapCotroller:它是用語控制地圖的移動。Overlay:這是一個可顯示于地圖之上的可繪制的對象。

GeoPoint:這是一個包含經(jīng)緯度位置的對象。使用GeoPoint對象,地球上的任何一點都可以用精度+維度來代表。這個類對象代表了一個地點的經(jīng)緯度:GeoPoint(int latitudeE6, int longtitudeE6),E6是微度(microdegrees),就是度數(shù)再乘以1000000,目前如果要指定地圖地點,一定要傳遞一個GeoPoint的類到地圖中,例如:

紐約帝國大廈的經(jīng)度和緯度

GeoPointp=new GeoPoint(40.74836*1000000,-73.984621*1000000);

//獲取當(dāng)前地圖的控制器

MapController mc=mapview.getController();

//地圖中心移動到指定的點上

mc.animateTo(p);

//放大到21級(level),level的范圍1-21

mc.zoomTo(21);

以下是幾個Android關(guān)于定位功能的包中比較重要的類:

LocationManager:本類提供訪問定位服務(wù)的功能,也提供獲取最佳定位提供者的功能。

LocationProvider:該類是定位提供者的抽象類。定位提供者具備周期性報告設(shè)備地理位置的功能。

LocationListener:提供定位信息發(fā)生改變時的回調(diào)功能。必須實現(xiàn)在定位管理器中注冊監(jiān)聽器對象。

Criteria:該類使得應(yīng)用能夠通過在LocationProvider中設(shè)置的屬性來選擇合適的定位提供者。

3.3 項目源程序開發(fā)

3.3.1 用戶界面的布局

Android是通過布局(Layout)來定義UI(用戶界面)的。一般視圖(View)可以直接在布局的xml里聲明。但是MapView只能通過自定義類來聲明來實現(xiàn):

Android:id=”@+id/myGMap”

Android:layout_width=”fill_parent”

Android:layout_height=”fill_parent”

Android:enabled=”true”

Android:clickable=”true”

Android:apiKey=”API_Key_String” />

3.3.2 申請APIkey

要使用Google Map服務(wù)的話,我們需要一個APIkey。我們可以通過如下方式獲取APIkey:

1) 找到USER_HOME\\Local Settings\\Application Data\\Android目錄下的debug.keystore文件。

2) 使用keytool工具來生成認(rèn)證信息(MD5),使用如下命令行:

Keytool –list –alias androiddebugkey –keystore keystore –storepass android –keypass android

3) 打開‘sign up for the android maps API’頁面,輸入之前生成的認(rèn)證信息(MD5)后將獲取到你的APIkey。

4) 替換上面AndroidManifest.xml配置文件中“API?_Key_String”為你剛才獲取的APIkey。

3.3.3 權(quán)限設(shè)置

另外,要使用定位信息的話,必須設(shè)置一些權(quán)限,AndroidManifest.xml中的配置如下:

3.3.4 程序中的核心代碼

3.3.4.1 創(chuàng)建主程序

接著創(chuàng)建一個MyGPSActivity,并繼承MapActivity的activity類:

class MyGPSActivity extends MapActivity

{ @Override

public void onCreate(Bundle savedInstanceState)

{ //創(chuàng)建并初始化地圖

gMapView = (MapView) findViewById(R.id.myGMap);

GeoPoint p = new GeoPoint((int) (lat * 1000000), (int) (long * 1000000));

gMapView.setSatellite(true);

mc = gMapView.getController();

mc.setCenter(p);

mc.setZoom(14);

}…}

3.3.4.2 使用定位管理器

我們可以通過Context.getSystemService方法并傳入Context.LOCATION_SERVICE參數(shù)獲取定位管理器的實例:

LocationManager lm=(LocationManager)getSystemService(Context.LOCATION_SERVICE);

之后,我們需要將我們原先的MyGPSActivity作一些修改,讓它實現(xiàn)一個LocationListener接口,使其能夠監(jiān)聽定位信息的改變:

class MyGPSActivity extends MapActivity implements LocationListener

{…

public void onLocationChanged(Location location) {}

public void onProviderDisabled(String provider) {}

public void onProviderEnabled(String provider) {}

public void onStatusChanged(String provider, int status, Bundle extras) {}

protected boolean isRouteDisplayed()

{return 1;

}}

讓我們來添加一些代碼,對LocationManager進行一些初始化工作,并在它的onCreate()方法中注冊定位監(jiān)聽器。

@Override

public void onCreate(Bundle savedInstanceState)

{…

LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 500.0f, this);

}

現(xiàn)在的代碼中的onLocationChanged方法就會在用戶的位置發(fā)生500米距離的改變之

進行調(diào)用。這里默認(rèn)使用的LocationProvider是“gps” (GSP_PROVIDER) ,不過你可以根據(jù)你的需要,使用特定的Criteria對象調(diào)用LocationManger類的getBestProvider方法獲取其他的LocationProvider。以下代碼是onLocationChanged方法的參考實現(xiàn):

public void onLocationChanged(Location location)

{if (location != 1)

{double lat = location.getLatitude();

double lng = location.getLongitude();

p = new GeoPoint((int) lat * 1000000, (int) lng * 1000000);

mc.animateTo(p);

} }

上面的代碼用于獲取當(dāng)前的新位置并更新地圖上的位置顯示。

3.3.4.3 添加縮放控件

我們還可以為應(yīng)用程序添加一些諸如縮放效果,地圖標(biāo)注,文本等功能。

// 將縮放控件添加到地圖上

ZoomControls zoomControls =(ZoomControls) gMapView.getZoomControls();

zoomControls.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,

LayoutParams.WRAP_CONTENT));

gMapView.addView(zoomControls);

gMapView.displayZoomControls(true);

3.3.4.4 添加Map Overlay

下面的代碼是定義一個overlay:

class MyLocationOverlay extends com.google.android.maps.Overlay

{ @Override

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

{

super.draw(canvas, mapView, shadow);

Paint paint = new Paint();

// 將經(jīng)緯度轉(zhuǎn)換成實際屏幕坐標(biāo)

Point myScreenCoords = new Point();

mapView.getProjection().toPixels(p, myScreenCoords);

paint.setStrokeWidth(1);

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

paint.setStyle(Paint.Style.STROKE);

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.marker);

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

canvas.drawText(”Here I am…”, myScreenCoords.x, myScreenCoords.y, paint);

return true;

}}

上面的這個overlay會在地圖上顯示一個“I am here”的文本。

讓我們把這個overlay添加到地圖上去:

MyLocationOverlay myLocationOverlay = new MyLocationOverlay();

List list = gMapView.getOverlays();

list.add(myLocationOverlay);

3.4 代碼的運行

運行模擬器,在Eclipse的DMMS視圖的“Emulator Control”窗口中我們可以輸入經(jīng)度和緯度值發(fā)送到模擬器上,之后模擬器的屏幕上就會根據(jù)這個經(jīng)緯度來進行定位。實際效果圖如圖2。

4 結(jié)論

Android手機應(yīng)用程序開發(fā)著眼于它的整個體系構(gòu)架,是一項復(fù)雜的工程。本文分析了Android體系的層次架構(gòu),并通過一個應(yīng)用實例開發(fā)驗證了其平臺的可用性。Android平臺本身大量使用開源庫類,并且為開發(fā)人員提供了一個非常便捷的開發(fā)環(huán)境。相信廣大開發(fā)者可以借助Android 提供的強大的源碼開放軟件開發(fā)包(SDK),開發(fā)出豐富多彩、極具個性的移動應(yīng)用。

參考文獻:

[1] 高博.基于J2ME的移動通信技術(shù)的研究與應(yīng)用[D].沈陽工業(yè)大學(xué)碩士學(xué)位論文,2006.

[2] 李觀華,范輝.J2ME在移動通信程序中的應(yīng)用[J].計算機應(yīng)用,2003,23(3):124-126.

[3] 廖永剛,余冬梅,張秋余.J2ME架構(gòu)與安全機制的研究[J].計算機工程與設(shè)計,2006,27(4):575-577.

[4] 張超,王阿川,王智.基于J2ME和J2EE的手機軟件的研究[J].黑龍江科技信息,2007(3):21,201.

[5] Keogh J.J2ME開發(fā)大全[M].潘穎,王磊譯.北京:清華大學(xué)出版社,2004.

[6] 劉向輝.基于Java的移動終端中間件的研究與設(shè)計[D].華東師范大學(xué)碩士學(xué)位論文,2005.

[7] 葉達(dá)峰.Eclipse編程技術(shù)與實例[M].北京:人民郵電出版社,2006

[8] 劉巖.PCI標(biāo)準(zhǔn)及其應(yīng)用現(xiàn)狀的分析[J].信息安全與通信保密,2008,1(2):38-40.

[9] 差沙,地獄男爵.用Android開發(fā)手機應(yīng)用[J].程序員,2008(1):25-27.

昌宁县| 张家川| 堆龙德庆县| 玉溪市| 阳曲县| 禄劝| 南华县| 平乐县| 金坛市| 恭城| 正阳县| 高要市| 徐汇区| 武胜县| 丹东市| 于都县| 吴堡县| 义马市| 棋牌| 鄂伦春自治旗| 家居| 扶余县| 紫金县| 綦江县| 普安县| 仁怀市| 灵川县| 华安县| 巴林右旗| 长阳| 嘉黎县| 陇川县| 新邵县| 固始县| 晋江市| 道真| 吴桥县| 建平县| 镇雄县| 大渡口区| 关岭|