日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
關(guān)于Android上如何做GPS相關(guān)定位服務(wù)

今天因為工作需要,把以前編寫的一個GPS測試程序拿出來重新修改了一下。這個程序說起來有些歷史了,是我11年編寫的,那時候?qū)W了Android開發(fā)沒多久,算是一個實驗性的作品?,F(xiàn)在工作需要,重新拿出來修整。同時發(fā)現(xiàn)我對android的GPS服務(wù)了解并不深,所以今天特意閱讀了有關(guān)GPS服務(wù)的一些資料,把相關(guān)知識點記錄下來。

創(chuàng)新互聯(lián)公司是由多位在大型網(wǎng)絡(luò)公司、廣告設(shè)計公司的優(yōu)秀設(shè)計人員和策劃人員組成的一個具有豐富經(jīng)驗的團(tuán)隊,其中包括網(wǎng)站策劃、網(wǎng)頁美工、網(wǎng)站程序員、網(wǎng)頁設(shè)計師、平面廣告設(shè)計師、網(wǎng)絡(luò)營銷人員及形象策劃。承接:網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、網(wǎng)站改版、網(wǎng)頁設(shè)計制作、網(wǎng)站建設(shè)與維護(hù)、網(wǎng)絡(luò)推廣、數(shù)據(jù)庫開發(fā),以高性價比制作企業(yè)網(wǎng)站、行業(yè)門戶平臺等全方位的服務(wù)。

本人做了GPS相關(guān)的嵌入式軟件已經(jīng)幾年了,所以說起要做個測試GPS定位模塊的程序,第一反應(yīng)就是串口讀取GPS模塊的數(shù)據(jù),然后解析GPS的NMEA格式數(shù)據(jù)。NMEA是一種標(biāo)準(zhǔn)化數(shù)據(jù)格式,不僅僅GPS上應(yīng)用了,其他一些工業(yè)通信也是使用這種標(biāo)準(zhǔn)化數(shù)據(jù)格式。解析相關(guān)數(shù)據(jù)然后顯示出來,就完成了一個基本的GPS定位測試功能。

查了一下才發(fā)現(xiàn)Android上做GPS相關(guān)定位服務(wù),不需要讀取NMEA數(shù)據(jù)分析,Android已經(jīng)封裝好了相關(guān)服務(wù),你要做的就是調(diào)用API。這個不知道應(yīng)該覺得爽還是覺得糾結(jié)。(Android也提供了讀取NMEA接口,下面會說到)

1、Android 定位服務(wù)

下面我們先來看看Android有關(guān)定位服務(wù)提供的支持:

Android定位服務(wù)都是位于location下,上面都有相關(guān)說明,這里就不詳細(xì)解析。有一點有需要說說的是:GpsStatus.NmeaListener 官方的說法是可以讀取NMEA數(shù)據(jù),但是我這里測試發(fā)現(xiàn),并沒有讀取到NMEA的數(shù)據(jù)。查閱過一些資料,說是google在底層并沒有實現(xiàn)數(shù)據(jù)反饋的功能。有時間,需要查看一下源碼。

2、LocationManager定位

 
 
 
 
  1. //獲取定位服務(wù) 
  2. LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 
  3. //判斷是否已經(jīng)打開GPS模塊 
  4. if (locationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) { 
  5. //GPS模塊打開,可以定位操作 
  6. // 通過GPS定位 
  7. String LocateType = locationManager.GPS_PROVIDER; 
  8. Location location = locationManager.getLastKnownLocation(LocateType); 
  9. // 設(shè)置監(jiān)聽器,設(shè)置自動更新間隔這里設(shè)置1000ms,移動距離:0米。 
  10. locationManager.requestLocationUpdates(provider, 1000, 0, locationListener); 
  11. // 設(shè)置狀態(tài)監(jiān)聽回調(diào)函數(shù)。statusListener是監(jiān)聽的回調(diào)函數(shù)。 
  12. locationManager.addGpsStatusListener(statusListener); 
  13. //另外給出 通過network定位設(shè)置 
  14. String LocateType = locationManager.NETWORK_PROVIDER; 
  15. Location location = locationManager.getLastKnownLocation(LocateType);  

3、GpsStatus監(jiān)聽器

上面給出了定位服務(wù)的初始化設(shè)置步驟,但我們都知道GPS衛(wèi)星是定期廣播數(shù)據(jù)的,也就是說會定期收到衛(wèi)星的GPS數(shù)據(jù)。我們并不能跟衛(wèi)星主動申請數(shù)據(jù),只能被動接收數(shù)據(jù)。(中國的北斗2倒是可以發(fā)送衛(wèi)星報文給衛(wèi)星)因此我們需要注冊一個監(jiān)聽器來處理衛(wèi)星返回的數(shù)據(jù)。

 
 
 
 
  1. private final GpsStatus.Listener statusListener = new GpsStatus.Listener() { 
  2.         public void onGpsStatusChanged(int event) { 
  3. // GPS狀態(tài)變化時的回調(diào),獲取當(dāng)前狀態(tài) 
  4.             GpsStatus status = locationManager.getGpsStatus(null); 
  5. //自己編寫的方法,獲取衛(wèi)星狀態(tài)相關(guān)數(shù)據(jù) 
  6.             GetGPSStatus(event, status); 
  7.         } 
  8.     };  

4、獲取搜索到的衛(wèi)星

 
 
 
 
  1. private void GetGPSStatus(int event, GpsStatus status) { 
  2.         Log.d(TAG, "enter the updateGpsStatus()"); 
  3.         if (status == null) { 
  4.         } else if (event == GpsStatus.GPS_EVENT_SATELLITE_STATUS) { 
  5. //獲取最大的衛(wèi)星數(shù)(這個只是一個預(yù)設(shè)值) 
  6.             int maxSatellites = status.getMaxSatellites(); 
  7.             Iterator it = status.getSatellites().iterator(); 
  8.             numSatelliteList.clear(); 
  9. //記錄實際的衛(wèi)星數(shù)目 
  10.             int count = 0; 
  11.             while (it.hasNext() && count <= maxSatellites) { 
  12. //保存衛(wèi)星的數(shù)據(jù)到一個隊列,用于刷新界面 
  13.                 GpsSatellite s = it.next(); 
  14.                 numSatelliteList.add(s); 
  15.                 count++; 
  16.                 Log.d(TAG, "updateGpsStatus----count=" + count); 
  17.             } 
  18.             mSatelliteNum = numSatelliteList.size(); 
  19.         } else if (event == GpsStatus.GPS_EVENT_STARTED) { 
  20. //定位啟動 
  21.         } else if (event == GpsStatus.GPS_EVENT_STOPPED) { 
  22. //定位結(jié)束 
  23.         } 
  24.     }  

上面就是從狀態(tài)值里面獲取搜索到的衛(wèi)星數(shù)目,主要是通過status.getSatellites()實現(xiàn)。獲取到的GpsSatellite對象,保存到一個隊列里面,用于后面刷新界面。上面是獲取GPS狀態(tài)監(jiān)聽器,除了GPS狀態(tài)外,我們還需要監(jiān)聽一個服務(wù),就是:LocationListener,定位監(jiān)聽器,監(jiān)聽位置的變化。這個對做定位服務(wù)的應(yīng)用來說,十分重要。

5、LocationListener監(jiān)聽器

 
 
 
 
  1. private final LocationListener locationListener = new LocationListener() 
  2.     { 
  3.         public void onLocationChanged(Location location) 
  4.         { 
  5. //當(dāng)坐標(biāo)改變時觸發(fā)此函數(shù),如果Provider傳進(jìn)相同的坐標(biāo),它就不會被觸發(fā) 
  6.             updateToNewLocation(location); 
  7.             Log.d(TAG, "LocationListener  onLocationChanged"); 
  8.         } 
  9.         public void onProviderDisabled(String provider) 
  10.         { 
  11. //Provider被disable時觸發(fā)此函數(shù),比如GPS被關(guān)閉 
  12.             Log.d(TAG, "LocationListener  onProviderDisabled"); 
  13.         } 
  14.         public void onProviderEnabled(String provider) 
  15.         { 
  16. // Provider被enable時觸發(fā)此函數(shù),比如GPS被打開 
  17.             Log.d(TAG, "LocationListener  onProviderEnabled"); 
  18.         } 
  19.         public void onStatusChanged(String provider, int status, Bundle extras) 
  20.         { 
  21.             Log.d(TAG, "LocationListener  onStatusChanged"); 
  22. // Provider的轉(zhuǎn)態(tài)在可用、暫時不可用和無服務(wù)三個狀態(tài)直接切換時觸發(fā)此函數(shù) 
  23.             if (status == LocationProvider.OUT_OF_SERVICE || status == LocationProvider.TEMPORARILY_UNAVAILABLE)       { 
  24.         } 
  25.         } 
  26.     };  

位置監(jiān)聽回調(diào)是用來處理GPS位置發(fā)生變化的時候,自動回調(diào)的方法,我們可以從這里獲取到當(dāng)前的GPS數(shù)據(jù)。另外我們可以通過回調(diào)函數(shù)提供的location參數(shù),獲取GPS的地理位置信息,包括經(jīng)緯度、速度、海拔等信息。 6、獲取地理位置信息(經(jīng)緯度、衛(wèi)星數(shù)目、海拔、定位狀態(tài))

 
 
 
 
  1. //location對象是從上面定位服務(wù)回調(diào)函數(shù)的參數(shù)獲取。 
  2. mLatitude = location.getLatitude();   // 經(jīng)度 
  3. mLongitude = location.getLongitude();  // 緯度 
  4. mAltitude = location.getAltitude();   //海拔 
  5. mSpeed = location.getSpeed();       //速度 
  6. mBearing = location.getBearing();    //方向  

7、獲取指定衛(wèi)星信息(方向角、高度角、信噪比)

 
 
 
 
  1. //temgGpsSatellite就是我們上面保存的搜索到的衛(wèi)星 
  2. //方向角 
  3. float azimuth = temgGpsSatellite.getAzimuth(); 
  4. //高度角 
  5. float elevation = temgGpsSatellite.getElevation(); 
  6. //信噪比 
  7. float snr = temgGpsSatellite.getSnr();  

利用方向角、高度角我們可以繪畫出一個二維圖形,表示衛(wèi)星在地球哪個方位,信噪比作用更大。一般的衛(wèi)星定位測試軟件,都提供了信噪比的狀態(tài)圖,這是表示GPS模塊搜星能力的代表。

8、繪畫二維衛(wèi)星位置圖

下面是我做的GPS測試的效果圖:

下面給出一個根據(jù)方向角和高度角,計算衛(wèi)星二維圖里面位置的方法,上面效果圖左邊的綠色圓點就代表衛(wèi)星位置。

右邊的信噪比柱狀圖,代表衛(wèi)星的接收信號能力。

 
 
 
 
  1. //根據(jù)方向角和高度角計算出,衛(wèi)星顯示的位置 
  2. Point point = new Point(); 
  3. int x = mEarthHeartX; //左邊地球圓形的圓心位置X坐標(biāo) 
  4. int y = mEarthHeartY; //左邊地球圓形的圓心位置Y坐標(biāo) 
  5. int r = mEarthR; 
  6. x+=(int)((r*elevation*Math.sin(Math.PI*azimuth/180)/90)); 
  7. y-=(int)((r*elevation*Math.cos(Math.PI*azimuth/180)/90)); 
  8. point.x = x; 
  9. point.y = y; 
  10. //point就是你需要繪畫衛(wèi)星圖的起始坐標(biāo)  

信噪比的繪畫,就是一個單位換算,這里就不給代碼了。

9、總結(jié):

Android為我們提供了很方便的位置服務(wù),主要通過GpsStatus、LocationManager、GpsSatellite這幾個類實現(xiàn)相關(guān)服務(wù)和監(jiān)聽。

不過個人覺得如果能直接讀取NMEA的數(shù)據(jù)也是很方便,起碼對于某些應(yīng)用來說,可以獲取更多信息。


分享題目:關(guān)于Android上如何做GPS相關(guān)定位服務(wù)
當(dāng)前地址:http://www.5511xx.com/article/djcogie.html