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