第7章 定位服務(wù)與地圖應(yīng)用_第1頁(yè)
第7章 定位服務(wù)與地圖應(yīng)用_第2頁(yè)
第7章 定位服務(wù)與地圖應(yīng)用_第3頁(yè)
第7章 定位服務(wù)與地圖應(yīng)用_第4頁(yè)
第7章 定位服務(wù)與地圖應(yīng)用_第5頁(yè)
已閱讀5頁(yè),還剩35頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第7章 定位服務(wù)與地圖(dt)應(yīng)用 共四十頁(yè)本章(bn zhn)學(xué)習(xí)目標(biāo)重點(diǎn):地圖(dt)密鑰的申請(qǐng)方法獲取位置信息的方法MapView和MapController的使用方法難點(diǎn):地圖密鑰的申請(qǐng)方法獲取位置信息的方法共四十頁(yè)7.1 定位(dngwi)服務(wù) 定位服務(wù)定位服務(wù)(Location-Based Services,LBS),又稱(chēng)定位服務(wù)或基于位置的服務(wù),融合了GPS定位、移動(dòng)通信、導(dǎo)航等多種技術(shù),提供了與空間位置相關(guān)的綜合應(yīng)用服務(wù)定位服務(wù)首先在日本得到(d do)商業(yè)化的應(yīng)用2001年7月,DoCoMo發(fā)布了第一款具有三角定位功能的手持設(shè)備2001年12月,KDDI發(fā)布第一款具有GPS功

2、能的手機(jī)基于位置的服務(wù)發(fā)展迅速,已涉及到商務(wù)、醫(yī)療、工作和生活的各個(gè)方面,為用戶(hù)提供定位、追蹤和敏感區(qū)域警告等一系列服務(wù) 共四十頁(yè)7.1 定位(dngwi)服務(wù) Android平臺(tái)支持提供定位服務(wù)的API,在開(kāi)發(fā)過(guò)程中主要用到LocationManager和LocationProviders對(duì)象LocationManager可以用來(lái)獲取當(dāng)前(dngqin)的位置,追蹤設(shè)備的移動(dòng)路線(xiàn),或設(shè)定敏感區(qū)域,在進(jìn)入或離開(kāi)敏感區(qū)域時(shí)設(shè)備會(huì)發(fā)出特定警報(bào)LocationProviders是能夠提供定位功能的組件集合,集合中的每種組件以不同的技術(shù)提供設(shè)備的當(dāng)前位置,區(qū)別在于定位的精度、速度和成本等方面共四十頁(yè)7

3、.1 定位(dngwi)服務(wù) 定位服務(wù)提供定位服務(wù),首先需要獲得LocationManager對(duì)象獲取LocationManager可以通過(guò)調(diào)用(dioyng)android.app.Activity.getSystemService()函數(shù)實(shí)現(xiàn)android.app.Activity.getSystemService()函數(shù)代碼如下代碼第1行的Context.LOCATION_SERVICE指明獲取的服務(wù)是定位服務(wù)代碼第2行的getSystemService()函數(shù),可以根據(jù)服務(wù)名稱(chēng)獲取Android提供的系統(tǒng)級(jí)服務(wù)String serviceString = Context.LOCATIO

4、N_SERVICE;LocationManager LocationManager = (LocationManager)getSystemService(serviceString);共四十頁(yè)7.1 定位(dngwi)服務(wù) Android支持的系統(tǒng)(xtng)級(jí)服務(wù)表Context類(lèi)的靜態(tài)常量值返回對(duì)象說(shuō)明LOCATION_SERVICElocationLocationManager控制位置等設(shè)備的更新WINDOW_SERVICEwindowWindowManager最頂層的窗口管理器LAYOUT_INFLATER_SERVICElayout_inflaterLayoutInflater將X

5、ML資源實(shí)例化為ViewPOWER_SERVICEpowerPowerManager電源管理ALARM_SERVICEalarmAlarmManager在指定時(shí)間接受IntentNOTIFICATION_SERVICEnotificationNotificationManager 后臺(tái)事件通知KEYGUARD_SERVICEkeyguardKeyguardManager鎖定或解鎖鍵盤(pán)SEARCH_SERVICEsearchSearchManager訪(fǎng)問(wèn)系統(tǒng)的搜索服務(wù)VIBRATOR_SERVICEvibratorVibrator 訪(fǎng)問(wèn)支持振動(dòng)的硬件CONNECTIVITY_SERVICEcon

6、nectionConnectivityManager 網(wǎng)絡(luò)連接管理WIFI_SERVICEwifiWifiManager Wi-Fi連接管理INPUT_METHOD_SERVICEinput_methodInputMethodManager 輸入法管理共四十頁(yè)定位服務(wù)在獲取到LocationManager后,還需要指定LocationManager的定位方法,然后才能夠調(diào)用LocationManagergetLastKnowLocation()方法獲取當(dāng)前位置LocationManager支持的定位方法有兩種GPS定位:可以提供更加精確的位置信息,但定位速度和質(zhì)量受到衛(wèi)星數(shù)量(shling)和

7、環(huán)境情況的影響網(wǎng)絡(luò)定位:提供的位置信息精度差,但速度較GPS定位快共四十頁(yè)7.1 定位(dngwi)服務(wù) 定位服務(wù)LocationManager支持定位方法在指定LocationManager的定位方法后,則可以調(diào)用getLastKnowLocation()方法獲取當(dāng)前的位置(wi zhi)信息LocationManager類(lèi)的靜態(tài)常量值說(shuō)明GPS_PROVIDERgps使用GPS定位,利用衛(wèi)星提供精確的位置信息,需要android.permissions.ACCESS_FINE_LOCATION用戶(hù)權(quán)限NETWORK_PROVIDERnetwork使用網(wǎng)絡(luò)定位,利用基站或Wi-Fi提供近似的

8、位置信息,需要具有如下權(quán)限:android.permission.ACCESS_COARSE_LOCATION或android.permission.ACCESS_FINE_LOCATION.共四十頁(yè)7.1 定位(dngwi)服務(wù) 定位服務(wù)以使用(shyng)GPS定位為例,獲取位置信息的代碼如下代碼第2行返回的Location對(duì)象中,包含了可以確定位置的信息,如經(jīng)度、緯度和速度等通過(guò)調(diào)用Location中的getLatitude()和getLonggitude()方法可以分別獲取位置信息中的緯度和經(jīng)度,示例代碼如下String provider = LocationManager.GPS_P

9、ROVIDER;Location location = locationManager.getLastKnownLocation(provider);double lat = location.getLatitude();double lng = location.getLongitude();共四十頁(yè)7.1 定位(dngwi)服務(wù) 定位服務(wù)LocationManager提供了一種便捷、高效的位置監(jiān)視方法(fngf)requestLocationUpdates(),可以根據(jù)位置的距離變化和時(shí)間間隔設(shè)定產(chǎn)生位置改變事件的條件,這樣可以避免因微小的距離變化而產(chǎn)生大量的位置改變事件LocationM

10、anager中設(shè)定監(jiān)聽(tīng)位置變化的代碼如下第1個(gè)參數(shù)是定位的方法,GPS定位或網(wǎng)絡(luò)定位第2個(gè)參數(shù)是產(chǎn)生位置改變事件的時(shí)間間隔,單位為微秒第3個(gè)參數(shù)是距離條件,單位是米第4個(gè)參數(shù)是回調(diào)函數(shù),在滿(mǎn)足條件后的位置改變事件的處理函數(shù)locationManager.requestLocationUpdates(provider, 2000, 10, locationListener);共四十頁(yè)7.1 定位(dngwi)服務(wù) 定位服務(wù)代碼將產(chǎn)生位置改變事件的條件設(shè)定為距離改變10米,時(shí)間間隔為2秒實(shí)現(xiàn)locationListener的代碼如下(rxi)第2行代碼onLocationChanged()在設(shè)備的

11、位置改變時(shí)被調(diào)用LocationListener locationListener = new 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) ;共四十頁(yè)7.1 定位(dngwi)

12、服務(wù) 定位(dngwi)服務(wù)第4行的onProviderDisabled()在用戶(hù)禁用具有定位功能的硬件時(shí)被調(diào)用第6行的onProviderEnabled()在用戶(hù)啟用具有定位功能的硬件時(shí)被調(diào)用第8行的onStatusChanged()在提供定位功能的硬件的狀態(tài)改變時(shí)被調(diào)用,如從不可獲取位置信息狀態(tài)到可以獲取位置信息的狀態(tài),反之亦然共四十頁(yè)7.1 定位(dngwi)服務(wù) 定位服務(wù)為了使GPS定位功能生效,還需要在AndroidManifest.xml文件中加入用戶(hù)(yngh)許可實(shí)現(xiàn)代碼如下共四十頁(yè)7.1 定位(dngwi)服務(wù) 定位服務(wù)CurrentLocationDemo是一個(gè)提供定位服務(wù)

13、的基本示例,提供了顯示當(dāng)前(dngqin)位置新的功能,并能夠監(jiān)視設(shè)備的位置變化共四十頁(yè)7.1 定位(dngwi)服務(wù) 定位服務(wù)定位服務(wù)一般都需要使用設(shè)備上的硬件,最理想的調(diào)試方式是將程序上傳到物理設(shè)備上運(yùn)行,但在沒(méi)有物理設(shè)備的情況下,也可以使用Android模擬器提供的虛擬方式模擬設(shè)備的位置變化(binhu),調(diào)試具有定位服務(wù)的應(yīng)用程序首先打開(kāi)DDMS中的模擬器控制,在Location Controls中的Longitude和Latitude部分輸入設(shè)備當(dāng)前的經(jīng)度和緯度,然后點(diǎn)擊Send按鈕,就將虛擬的位置信息發(fā)送到Android模擬器中共四十頁(yè)7.1 定位(dngwi)服務(wù) 定位服務(wù)在程序

14、運(yùn)行過(guò)程中,可以在模擬器控制器中改變經(jīng)度和緯度(wid)坐標(biāo)值,程序在檢測(cè)到位置的變化后,會(huì)將最新的位置信息顯示在界面上但筆者在1.5版本的Android模擬器中進(jìn)行調(diào)試時(shí),發(fā)現(xiàn)模擬器控制器只能成功的將虛擬坐標(biāo)發(fā)送到模擬器中2次,超過(guò)2次后模擬器對(duì)新發(fā)送的虛擬坐標(biāo)不再響應(yīng)共四十頁(yè)7.1 定位(dngwi)服務(wù) 定位(dngwi)服務(wù)下面是CurrentLocationDemo示例中LocationBasedServiceDemo.java文件的完整代碼package edu.hrbeu.LocationBasedServiceDemo; import android.app.Activity;

15、import android.content.Context;import android.os.Bundle;import android.widget.TextView;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager; 共四十頁(yè)7.1 定位(dngwi)服務(wù) 定位(dngwi)服務(wù) public class LocationBasedServiceDemo extends Activity Overridepub

16、lic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.main); String serviceString = Context.LOCATION_SERVICE; LocationManager locationManager = (LocationManager)getSystemService(serviceString);String provider = LocationManager.GPS_PROVIDER;Location l

17、ocation = locationManager.getLastKnownLocation(provider);getLocationInfo(location);locationManager.requestLocationUpdates(provider, 2000, 0, locationListener); 共四十頁(yè)7.1 定位(dngwi)服務(wù) 定位(dngwi)服務(wù) private void getLocationInfo(Location location)String latLongInfo;TextView locationText = (TextView)findView

18、ById(R.id.txtshow);if (location != null)double lat = location.getLatitude();double lng = location.getLongitude();latLongInfo = Lat: + lat + nLong: + lng;elselatLongInfo = No location found;locationText.setText(Your Current Position is:n + latLongInfo); private final LocationListener locationListener

19、 = new LocationListener()Overridepublic void onLocationChanged(Location location) getLocationInfo(location);共四十頁(yè)7.1 定位(dngwi)服務(wù) 定位(dngwi)服務(wù) Override public void onProviderDisabled(String provider) getLocationInfo(null); Override public void onProviderEnabled(String provider) getLocationInfo(null); O

20、verride public void onStatusChanged(String provider, int status, Bundle extras) ;共四十頁(yè)7.2 Google地圖(dt)應(yīng)用7.2.1 申請(qǐng)地圖密鑰首先(shuxin)向Google申請(qǐng)一組經(jīng)過(guò)驗(yàn)證的“地圖密鑰”(Map API Key),然后使用MapView(com.google.android.maps.MapView)就可以將Google地圖嵌入到Android應(yīng)用程序中,才能正常使用Google的地圖服務(wù)“地圖密鑰”是訪(fǎng)問(wèn)Google地圖數(shù)據(jù)的密鑰,無(wú)論是模擬器還是在真實(shí)設(shè)備中需要使用這個(gè)密鑰共四十頁(yè)7

21、.2 Google地圖(dt)應(yīng)用7.2.1 申請(qǐng)地圖密鑰注冊(cè)“地圖密鑰”的第一步是申請(qǐng)一個(gè)Google賬戶(hù),也就是Gmail電子郵箱,申請(qǐng)地址是/accounts/Login找到保存Debug證書(shū)的keystore的保存位置,并獲取證書(shū)的MD5散列值keystore是一個(gè)密碼保護(hù)的文件,用來(lái)(yn li)存儲(chǔ)Android提供的用于調(diào)試的證書(shū),獲取MD5散列值的主要目的是為下一步申請(qǐng)“地圖密鑰”做準(zhǔn)備共四十頁(yè)7.2 Google地圖(dt)應(yīng)用7.2.1 申請(qǐng)地圖密鑰獲取(huq)證書(shū)的保存地址:首先打開(kāi)Eclipse,通過(guò)Window Preferences打開(kāi)配置窗體,在Android

22、Build欄中的Default debug keystore中可以找到共四十頁(yè)7.2 Google地圖(dt)應(yīng)用7.2.1 申請(qǐng)地圖密鑰為了(wi le)獲取Debug證書(shū)MD5散列值的,需要打開(kāi)命令行工具CMD,然后切換到keystore的目錄,輸入如下命令如果提示無(wú)法找到keytool,可以將/bin的路徑添加到系統(tǒng)的PATH變量中keytool list keystore debug.keystore共四十頁(yè)7.2 Google地圖(dt)應(yīng)用7.2.1 申請(qǐng)地圖密鑰在提示輸入keystore密碼時(shí),輸入缺省密碼android,MD5散列將顯示在最下方(xi fn)。筆者的MD5散列值

23、為FE:CF:91:36:EA:9D:91:13:BF:B2:FC:27:E4:1E:55:71共四十頁(yè)7.2 Google地圖(dt)應(yīng)用7.2.1 申請(qǐng)地圖密鑰申請(qǐng)“地圖密鑰”的最后一步(y b)是打開(kāi)申請(qǐng)頁(yè)面,輸入MD5散列值申請(qǐng)頁(yè)面的地址是/intl/zh-CN/android/add-ons/google-apis/maps-api-signup.html共四十頁(yè)7.2 Google地圖(dt)應(yīng)用7.2.1 申請(qǐng)(shnqng)地圖密鑰共四十頁(yè)7.2 Google地圖(dt)應(yīng)用7.2.1 申請(qǐng)地圖(dt)密鑰輸入MD5散列值后,點(diǎn)擊Generate API Key按鈕,將提示用戶(hù)

24、輸入Google賬戶(hù),正確輸入Google賬戶(hù)后,將產(chǎn)生申請(qǐng)“地圖密鑰”的獲取結(jié)果共四十頁(yè)7.2 Google地圖(dt)應(yīng)用7.2.1 申請(qǐng)地圖密鑰筆者獲取的“地圖密鑰”是0mVK8GeO6WUz4S2F94z52CIGSSlvlTwnrE4DsiA,在以后使用到MapView的時(shí)候都需要輸入這個(gè)密鑰但需要注意的是,讀者并不能使用這個(gè)密鑰,讀者需要根據(jù)自己的Debug證書(shū)的MD5散列值,重新(chngxn)到Google網(wǎng)站上申請(qǐng)一個(gè)用于調(diào)試程序的“地圖密鑰”共四十頁(yè)7.2 Google地圖(dt)應(yīng)用7.2.2 使用Google地圖MapView的地圖的顯示控件,可以設(shè)置不同的顯示模式,例

25、如衛(wèi)星模式、街道模式或交通模式MapController則是MapView的控制器,可以控制MapView的顯示中心和縮放級(jí)別等功能下面(xi mian)的內(nèi)容以GoogleMapDemo為例,說(shuō)明如何在Android系統(tǒng)中開(kāi)發(fā)Google地圖程序這個(gè)示例將在程序內(nèi)部設(shè)置一個(gè)坐標(biāo)點(diǎn),然后在程序啟動(dòng)時(shí),使用MapView控件在地圖上顯示這個(gè)坐標(biāo)點(diǎn)的位置共四十頁(yè)7.2 Google地圖(dt)應(yīng)用7.2.2 使用Google地圖在建立工程時(shí)將com.google.android.maps的擴(kuò)展庫(kù)添加到工程中,這樣就可以使用Google地圖的所有功能添加com.google.android.maps

26、擴(kuò)展庫(kù)的方式是在創(chuàng)建工程時(shí),在Build Target項(xiàng)中選擇Google APIs創(chuàng)建工程后,修改/res/layout/main.xml文件,在布局中加入(jir)一個(gè)MapView控件,并設(shè)置剛獲取的“地圖密鑰”共四十頁(yè)7.2 Google地圖(dt)應(yīng)用7.2.2 使用Google地圖main.xml文件的完整(wnzhng)代碼如下共四十頁(yè)7.2 Google地圖(dt)應(yīng)用7.2.2 使用Google地圖僅在布局中添加MapView控件,還不能夠直接在程序(chngx)中調(diào)用這個(gè)控件,還需要將程序(chngx)本身設(shè)置成MapActivity(com.google.android.

27、maps.MapActivity)MapActivity類(lèi)負(fù)責(zé)處理顯示Google地圖所需的生命周期和后臺(tái)服務(wù)管理下面先給出整個(gè)GoogleMapDemo.java文件的完整代碼package edu.hrbeu.GoogleMapDemo; import com.google.android.maps.GeoPoint;import com.google.android.maps.MapActivity;import com.google.android.maps.MapController;import com.google.android.maps.MapView; 共四十頁(yè)7.2 Go

28、ogle地圖(dt)應(yīng)用7.2.2 使用(shyng)Google地圖import android.os.Bundle; public class GoogleMapDemo extends MapActivity private MapView mapView;private MapController mapController;Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.main); mapView =

29、(MapView)findViewById(R.id.mapview);mapController = mapView.getController(); Double lng = 126.676530486 * 1E6;Double lat = 45.7698895661 * 1E6;GeoPoint point = new GeoPoint(Value(), Value();共四十頁(yè)7.2 Google地圖(dt)應(yīng)用7.2.2 使用(shyng)Google地圖25. mapController.setCenter(point);mapController.setZoom(11);mapController.animateTo(point);mapView.setSatellite(false) O

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論