成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

關于Android上如何做GPS相關定位服務

移動開發 Android
今天因為工作需要,把以前編寫的一個GPS測試程序拿出來重新修改了一下。這個程序說起來有些歷史了,是我11年編寫的,那時候學了Android開發沒多久,算是一個實驗性的作品。現在工作需要,重新拿出來修整。

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

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

查了一下才發現Android上做GPS相關定位服務,不需要讀取NMEA數據分析,Android已經封裝好了相關服務,你要做的就是調用API。這個不知道應該覺得爽還是覺得糾結。(Android也提供了讀取NMEA接口,下面會說到)

1、Android 定位服務

下面我們先來看看Android有關定位服務提供的支持:

 

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

2、LocationManager定位

  1. //獲取定位服務 
  2. LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 
  3. //判斷是否已經打開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. // 設置監聽器,設置自動更新間隔這里設置1000ms,移動距離:0米。 
  10. locationManager.requestLocationUpdates(provider, 1000, 0, locationListener); 
  11. // 設置狀態監聽回調函數。statusListener是監聽的回調函數。 
  12. locationManager.addGpsStatusListener(statusListener); 
  13. //另外給出 通過network定位設置 
  14. String LocateType = locationManager.NETWORK_PROVIDER; 
  15. Location location = locationManager.getLastKnownLocation(LocateType);  

3、GpsStatus監聽器

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

  1. private final GpsStatus.Listener statusListener = new GpsStatus.Listener() { 
  2.         public void onGpsStatusChanged(int event) { 
  3. // GPS狀態變化時的回調,獲取當前狀態 
  4.             GpsStatus status = locationManager.getGpsStatus(null); 
  5. //自己編寫的方法,獲取衛星狀態相關數據 
  6.             GetGPSStatus(event, status); 
  7.         } 
  8.     };  

4、獲取搜索到的衛星

  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. //獲取最大的衛星數(這個只是一個預設值) 
  6.             int maxSatellites = status.getMaxSatellites(); 
  7.             Iterator it = status.getSatellites().iterator(); 
  8.             numSatelliteList.clear(); 
  9. //記錄實際的衛星數目 
  10.             int count = 0; 
  11.             while (it.hasNext() && count <= maxSatellites) { 
  12. //保存衛星的數據到一個隊列,用于刷新界面 
  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. //定位結束 
  23.         } 
  24.     }  

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

5、LocationListener監聽器

  1. private final LocationListener locationListener = new LocationListener() 
  2.     { 
  3.         public void onLocationChanged(Location location) 
  4.         { 
  5. //當坐標改變時觸發此函數,如果Provider傳進相同的坐標,它就不會被觸發 
  6.             updateToNewLocation(location); 
  7.             Log.d(TAG, "LocationListener  onLocationChanged"); 
  8.         } 
  9.         public void onProviderDisabled(String provider) 
  10.         { 
  11. //Provider被disable時觸發此函數,比如GPS被關閉 
  12.             Log.d(TAG, "LocationListener  onProviderDisabled"); 
  13.         } 
  14.         public void onProviderEnabled(String provider) 
  15.         { 
  16. // Provider被enable時觸發此函數,比如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的轉態在可用、暫時不可用和無服務三個狀態直接切換時觸發此函數 
  23.             if (status == LocationProvider.OUT_OF_SERVICE || status == LocationProvider.TEMPORARILY_UNAVAILABLE)       { 
  24.         } 
  25.         } 
  26.     };  

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

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

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

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

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

8、繪畫二維衛星位置圖

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

 

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

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

  1. //根據方向角和高度角計算出,衛星顯示的位置 
  2. Point point = new Point(); 
  3. int x = mEarthHeartX; //左邊地球圓形的圓心位置X坐標 
  4. int y = mEarthHeartY; //左邊地球圓形的圓心位置Y坐標 
  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就是你需要繪畫衛星圖的起始坐標  

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

9、總結:

Android為我們提供了很方便的位置服務,主要通過GpsStatus、LocationManager、GpsSatellite這幾個類實現相關服務和監聽。

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

責任編輯:龐桂玉 來源: Android開發中文站
相關推薦

2009-12-30 11:16:36

Silverlight

2010-06-11 17:04:17

OSPF路由協議

2013-11-13 10:21:42

混合云服務私有數據中心公共云

2011-05-27 15:56:30

Android

2023-10-28 09:08:19

微服務saas私有化

2014-11-13 14:07:04

2022-08-03 09:11:31

React性能優化

2022-08-29 08:08:58

SQLOracleCPU

2020-08-06 11:20:49

數據泄露NSA位置數據

2018-01-11 14:38:43

2017-12-12 16:17:55

微服務系統運維

2015-07-30 11:21:16

代碼審查

2013-03-29 10:47:39

Android獲取經緯AndroidGPS定

2014-06-27 14:53:06

應用App產品

2012-03-12 16:42:54

測試

2022-02-17 13:18:58

定價模型營銷AHP

2023-12-29 10:04:47

數據分析

2013-07-24 10:01:24

產品設計產品經理新手做產品

2012-05-07 08:49:57

Clojure

2021-04-25 09:19:22

騰訊Code Reviewleader
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久国产高清 | 91精品国产综合久久香蕉922 | 做a视频在线观看 | 黄色片网站在线观看 | 欧美一级视频免费看 | 伊人久久免费视频 | 日干夜操| 日韩精品人成在线播放 | 欧美日韩在线免费 | 精品一区久久 | 亚洲36d大奶网 | com.色.www在线观看 | 蜜桃精品视频在线 | 精品国产一区二区三区日日嗨 | 久久国产精品免费视频 | av免费看在线 | 人人看人人草 | 国产三级 | 成人国产精品一级毛片视频毛片 | 色小姐综合网 | 狠狠av | 日韩一区二区三区四区五区 | 韩国毛片一区二区三区 | 欧美精品一区二区三区在线播放 | 免费精品久久久久久中文字幕 | av毛片在线免费观看 | 日日夜夜精品视频 | 一级毛片在线播放 | 男人亚洲天堂 | 特黄色毛片 | 高清一区二区三区 | 欧美日韩高清在线观看 | 福利精品在线观看 | 精品自拍视频在线观看 | www国产成人免费观看视频,深夜成人网 | 一级毛片在线播放 | 一区二区在线免费观看视频 | 91观看| 一区二区三区精品视频 | 6996成人影院网在线播放 | 在线观看www高清视频 |