Android GPS定位
定位方式
地理坐標的獲取,有四種方式GPS定位,WIFI定位,基站定位,AGPS定位。
(1)純硬件定位
需要GPS硬件支持,直接和衛星交互來獲取當前經緯度
(2)純軟件定位
一種是通過WIFI連接來確認熱點的位置 然后給出一個比較大概的位置(獲得WIFI的AP地址之后,是需要連接WIFI數據庫來獲得真正的地址的 )
一種是通過移動基站的MSC(Mobile Switching Center移動通信系統)交互來確認你注冊的是哪個基站 以及基站的位置(可能和多個基站交互來獲取較精確的位置信息)
(3)軟硬件混合定位方式
AGPS 先通過軟件來獲取大概位置 然后得到此區域的衛星序列 和衛星通信
常用的是GPS和WIFI(即NetWork)。
如何獲取當前地理坐標位置
(1)權限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission..ACCESS_FINE_LOCATION" />Android 6.0以上,需要在運行時查看相應權限是否申請成功。
(2)獲取LocationManager
LocationManager mLocationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);(3)提供定位需求(Optional)
該步驟可選。可通過指定Provider Name,直接跳過步驟(3)(4)(5)
Criteria mCriteria = new Criteria(); mCriteria.setAccuracy(Criteria.ACCURACY_FINE);//精確度要求 mCriteria.setSpeedRequired(true);//是否包含移動速度 mCriteria.setAltitudeRequired(true);//是否包括高度 mCriteria.setBearingRequired(true);//是否包括方位 mCriteria.setCostAllowed(true);//是否允許付費 mCriteria.setPowerRequirement(Criteria.POWER_LOW);//對耗電量的要求精確度包括:
Criteria.ACCURACY_FINE,精確位置
Criteria.ACCURACY_HIGH, 誤差小于100米
Criteria.ACCURACY_MEDIUM,誤差在100至500米間
Criteria.ACCURACY_LOW,誤差小于500米
Criteria.ACCURACY_COARSE,粗略位置
對耗電量要求包括:
Criteria.POWER_LOW,低耗電量
Criteria.POWER_HIGH,高耗電量
(4)獲取適宜的Location Provider Name(Optional)
該步驟為可選。
String mProviderName = mLocationManager.getBestProvider(mCriteria, true);其中getBestProvider第二個參數,為Boolean類型,enabledOnly,是指是否只查找可用的Provider.
(5)根據Location Provider Name查看Location Provider是否可用(Optional)
若在之前調用了getBestProvider方法,并將該方法的第二參數設置為true,則該步驟可省略。
mLocationManager.isProviderEnabled(mProviderName)方法返回Boolean變量,可根據Provider是否可用選擇備用方案。
(6)監聽Location
mLocationListener = new LocationListener() {@Overridepublic void onLocationChanged(Location location) {mlocation=location;}@Overridepublic void onStatusChanged(String s, int i, Bundle bundle) {}@Overridepublic void onProviderEnabled(String s) {}@Overridepublic void onProviderDisabled(String s) {} };其中onLocationChanged方法最為重要。可通過該方法獲取當前坐標信息。
onStatusChanged方法表示,Provider狀態的變化,例如WIFI的連接或斷開。
onProviderEnabled方法,onProviderDisabled方法則監聽Provider是否可用,比如GPS打開或關閉。
(7)根據Location Provider Name和監聽Listener獲取當前坐標
mLocationManager.requestLocationUpdates(mProviderName, mMinTime, mMinDistance, mLocationListener);該步驟最為關鍵。通過調用requestLocationUpdates,建立Provider和Listener間的聯系。
參數一,mProviderName,可以有三個選項。
(a)LocationManager.NETWORK_PROVIDER,使用WIFI來定位
(b)LocationManager.GPS_PROVIDER,使用GPS來定位
(c)LocationManager.PASSIVE_PROVIDER,被動定位方式。當其他應用使用定位更新了定位信息,系統會保存下來,該應用接收到消息后直接讀取就可以了。比如如果系統中已經安裝了百度地圖,高德地圖(室內可以實現精確定位),你只要使用它們定位過后,再使用這種方法在你的程序肯定是可以拿到比較精確的定位信息。但該方式,不常用。僅用前兩者就好。
參數二,mMinTime,單位毫秒,指定更新的最小間隔。但該參數并不準確,可能長,也可能短。因此,不要太迷信該參數。
參數三,mMinDistance,單位米,指定更新坐標的最小差距。
若成功獲取坐標,將在mLocationListener的onLocationChanged方法中獲得。
(8)取消監聽
當需要停止坐標更新時,需要取消監聽。
GPS的優缺點
GPS的有點是定位準確,但也是唯一有點。
缺點不多,但致命:定位慢,耗電量大。定位慢,也是onLocationChanged常常無法拿到Location(NULL)的原因。
建議使用LocationManager.NETWORK_PROVIDER來獲取定位信息。其速度快,準確度與GPS相差無幾。
另外還需要指出的是,獲取到Location的坐標后,尚不能直接轉換為實際地址。對于不同的地圖,其坐標系也不同,因此進行坐標系的轉換是必要的。
以百度地圖為例,支持三種地圖。
(1)WGS84:為一種大地坐標系,也是目前廣泛使用的GPS全球衛星定位系統使用的坐標系;
(2) GCJ02:是由中國國家測繪局制訂的地理信息系統的坐標系統,是由WGS84坐標系經加密后的坐標系;
(3)BD09:百度坐標系,在GCJ02坐標系基礎上再次加密。其中BD09ll表示百度經緯度坐標,BD09mc表示百度墨卡托米制坐標。
百度地圖在國內(包括港澳臺)使用的是BD09坐標;在海外地區,統一使用WGS84坐標。開發者在使用百度地圖相關服務時,請注意選擇。
因此,從GPS獲取坐標后,在國內需要轉換為GCJ02坐標。相應轉換方法,此處不再描述,感興趣的同學可以自行百度或谷歌。
總結
以上是生活随笔為你收集整理的Android GPS定位的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [jQuery] jquery.exte
- 下一篇: [css] 请说说*{box-sizi