android定位的實(shí)現(xiàn)

先拋問題:

  1. locationManager.getLastKnownLocation方法返回null歇盼。
  2. 如何實(shí)現(xiàn)快速而又精確的定位冤馏。

手機(jī)定位方案

我們常用的定位一般也就下面這兩種發(fā)方案:

  • GPS定位
  • 網(wǎng)絡(luò)定位(基站定位)

最簡單的手機(jī)定位方式當(dāng)然是通過GPS模塊(現(xiàn)在大部分的智能機(jī)應(yīng)該都有了)挂签。GPS方式準(zhǔn)確度是最高的,但是它的缺點(diǎn)也非常明顯:

  1. 比較耗電岖寞;
  2. 絕大部分用戶默認(rèn)不開啟GPS模塊测暗;
  3. 從GPS模塊啟動到獲取第一次定位數(shù)據(jù)椒舵,可能需要比較長的時間蚂踊;
  4. 室內(nèi)幾乎無法使用。

這其中逮栅,缺點(diǎn)2,3都是比較致命的悴势。需要指出的是,GPS走的是衛(wèi)星通信的通道措伐,在沒有網(wǎng)絡(luò)連接的情況下也能用特纤。

另外一種常見的定位方式也就是網(wǎng)絡(luò)定位了,也就基站定位。大致思路就是采集到手機(jī)上的基站ID號(cellid)和其它的一些信息(MNC侥加,MCC捧存,LAC等等),然后通過網(wǎng)絡(luò)訪問一些定位服務(wù)担败,獲取并返回對應(yīng)的經(jīng)緯度坐標(biāo)昔穴。基站定位的精確度不如GPS提前,但好處是能夠在室內(nèi)用吗货,只要網(wǎng)絡(luò)通暢就行。
還有Wifi定位狈网。和基站定位類似宙搬,這種方式是通過獲取當(dāng)前所用的wifi的一些信息,然后訪問網(wǎng)絡(luò)上的定位服務(wù)以獲得經(jīng)緯度坐標(biāo)拓哺。因?yàn)樗突径ㄎ黄鋵?shí)都需要使用網(wǎng)絡(luò)勇垛,所以在Android也統(tǒng)稱為Network方式。另外,需要指出的是網(wǎng)上相當(dāng)一部分人說由于國內(nèi)沒有Google服務(wù),無法實(shí)現(xiàn)網(wǎng)絡(luò)定位,這個不敢茍同,用手機(jī)基站和WIFI節(jié)點(diǎn)的地址來大致定位位置士鸥,這種定位方式取決于服務(wù)器闲孤,即取決于將基站或WIF節(jié)點(diǎn)信息翻譯成位置信息的服務(wù)器的能力。市面上的手機(jī)廠商基本在手機(jī)系統(tǒng)底部是已經(jīng)接入國內(nèi)位置信息服務(wù)器的,所以說在國內(nèi)無法實(shí)現(xiàn)網(wǎng)絡(luò)定位的說法是不存在的烤礁。

不多說,來看看一般的實(shí)現(xiàn)定位的代碼:

LocationManager  mLocationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
Criteria criteria = new Criteria();  
criteria.setAccuracy(Criteria.ACCURACY_FINE);//高精度  
criteria.setAltitudeRequired(false);//無海拔要求   criteria.setBearingRequired(false);//無方位要求  
criteria.setCostAllowed(true);//允許產(chǎn)生資費(fèi)   criteria.setPowerRequirement(Criteria.POWER_LOW);//低功耗  
        
// 獲取最佳服務(wù)對象  
String provider = locationManager.getBestProvider(criteria,true);  
locationManager.getLastKnownLocation(provider);  

locationManager.getBestProvider(criteria,true);方法看起來很完美讼积,但其實(shí)返回值就network肥照、gps二選一。而且如果你要求高精度勤众,它會優(yōu)先檢查GPS建峭,如果手機(jī)開啟了GPS就返回GPS,否則返回network决摧。如果都沒開啟則返回null。

最要說的就是getLastKnownLocation()方法,首先它獲取的是最近一次的定位信息,如果第一次運(yùn)行呢,當(dāng)然為空,即使不為空,通過它拿到的位置也未必是實(shí)時的位置信息吧凑兰。網(wǎng)絡(luò)定位耗時一般在2秒左右(網(wǎng)絡(luò)差掌桩,時間會更長), 這些都是造成getLastKnownLocation為空的原因,而且如果采取的定位方式是gps,那么90%得到的Location會為空。

那么如果實(shí)現(xiàn)盡可能的精準(zhǔn)定位呢?

谷歌是有為我們推薦的,可參看:https://developer.android.com/guide/topics/location/strategies.html

思路大概就是通過網(wǎng)絡(luò)定位和gps定位的結(jié)合,來盡可能的獲取準(zhǔn)確定位,接下來,所要討論是基于只定位一次的情況下,大部分情況下也確實(shí)是這樣!

  1. 開啟network和gps監(jiān)聽
  2. 獲得network定位信息location后,移除network監(jiān)聽
  3. 獲得gps定位信息location,移除gps監(jiān)聽
  4. 比較當(dāng)前l(fā)ocation和新獲取的location哪個更好(來自gps)

既然結(jié)合兩者姑食,就要同時為兩者添加監(jiān)聽 :

 mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME, MIN_DISTANCE, gpsLocationListener);
        mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME, MIN_DISTANCE, networkListener);

其中MIN_TIME和MIN_DISTANCE根據(jù)自己實(shí)際情況定義波岛。

網(wǎng)絡(luò)定位監(jiān)聽器:

 LocationListener networkListener = new LocationListener() {

        @Override
        public void onLocationChanged(Location location) {
            if (isBetterLocation(location, mLocation)) {
                mLocation = location;
            }
            if (mLocation != null) {
                mLocationManager.removeUpdates(this);
            }

        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

        @Override
        public void onProviderEnabled(String provider) {
        }

        @Override
        public void onProviderDisabled(String provider) {
        }

    };

gps定位監(jiān)聽器

 LocationListener gpsLocationListener = new LocationListener() {

        @Override
        public void onLocationChanged(Location location) {
            if (isBetterLocation(location, mLocation)) {
                mLocationManager.removeUpdates(networkListener);
                mLocation = location;
            }
            if (mLocation != null) {
                mLocationManager.removeUpdates(this);

            }
        }

        @Override
        public void onProviderDisabled(String provider) {
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }
    };

isBetterLocation(Location location, Location currentBestLocation)方法是參考的Google官方提供的,可自行查看.

最后不要忘了要清除監(jiān)聽

 public void removeListener() {
        if (mLocationManager != null) {
            uniqueInstance = null;
            mLocationManager.removeUpdates(networkListener);
            mLocationManager.removeUpdates(gpsLocationListener);
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市音半,隨后出現(xiàn)的幾起案子则拷,更是在濱河造成了極大的恐慌,老刑警劉巖曹鸠,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煌茬,死亡現(xiàn)場離奇詭異,居然都是意外死亡彻桃,警方通過查閱死者的電腦和手機(jī)坛善,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邻眷,“玉大人眠屎,你說我怎么就攤上這事∷寥模” “怎么了改衩?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驯镊。 經(jīng)常有香客問我葫督,道長,這世上最難降的妖魔是什么阿宅? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任候衍,我火速辦了婚禮,結(jié)果婚禮上洒放,老公的妹妹穿的比我還像新娘蛉鹿。我一直安慰自己,他們只是感情好往湿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布妖异。 她就那樣靜靜地躺著惋戏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪他膳。 梳的紋絲不亂的頭發(fā)上响逢,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機(jī)與錄音棕孙,去河邊找鬼舔亭。 笑死,一個胖子當(dāng)著我的面吹牛蟀俊,可吹牛的內(nèi)容都是我干的钦铺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肢预,長吁一口氣:“原來是場噩夢啊……” “哼矛洞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起烫映,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤沼本,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后锭沟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抽兆,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年冈钦,在試婚紗的時候發(fā)現(xiàn)自己被綠了郊丛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞧筛,死狀恐怖厉熟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情较幌,我是刑警寧澤揍瑟,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站乍炉,受9級特大地震影響绢片,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜岛琼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一底循、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧槐瑞,春花似錦熙涤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽那槽。三九已至,卻和暖如春等舔,著一層夾襖步出監(jiān)牢的瞬間骚灸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工慌植, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甚牲,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓蝶柿,卻偏偏與公主長得像鳖藕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子只锭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容