時間 2014-06-17 07:58:09 CSDN博客java
原文 http://blog.csdn.net/itleaks/article/details/31511105android
主題 安卓開發git
你們去網上搜索Android定位location爲null無法定位問題,估計有一大堆文章介紹如何來解決,可是最後你們發現基本沒用。本文將從Android定位實現原理來深刻分析無法定位緣由並提出真正的解決方案。在分析以前,咱們確定得先看看android官方提供的定位SDK。服務器
mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Android系統存在多種provider,分別是網絡
GPS_PROVIDER:ide
這個就是手機裏有GPS芯片,而後利用該芯片就能利用衛星得到本身的位置信息。可是在室內,GPS定位基本沒用,很難定位的到。ui
NETWORK_PROVIDER:this
這個就是利用網絡定位,一般是利用手機基站和WIFI節點的地址來大體定位位置,google
這種定位方式取決於服務器,即取決於將基站或WIF節點信息翻譯成位置信息的服務器的能力。因爲目前大部分Android手機沒有安裝google官方的location manager庫,大陸網絡也不容許,即沒有服務器來作這個事情,天然該方法基本上無法實現定位。spa
PASSIVE_PROVIDER:
被動定位方式,這個意思也比較明顯,就是用現成的,當其餘應用使用定位更新了定位信息,系統會保存下來,該應用接收到消息後直接讀取就能夠了。好比若是系統中已經安裝了百度地圖,高德地圖(室內能夠實現精肯定位),你只要使用它們定位事後,再使用這種方法在你的程序確定是能夠拿到比較精確的定位信息。
用戶能夠直接指定某一個provider
String provider = mLocationManager.getProvider(LocationManager.GPS_PROVIDER);
也能夠提供配置,由系統根據用戶的配置爲用戶選擇一個最接近用戶需求的provider
Criteria crite = new Criteria(); crite.setAccuracy(Crite.ACCURACY_FINE); //精度crite.setPowerRequirement(Crite.POWER_LOW); //功耗類型選擇String provider = mLocationManager.getBestProvider(crite, true);
Location location = mLocationManager.getLocation(provider);
而後你會發現,這個返回的location永遠爲null,你天然無法定位。而後網上處處是諮詢爲啥得到的location爲null,一樣網絡處處是解決這個問題的所謂解決方案。
網上有人說,一開始location是頗有多是null的 ,這是由於程序還歷來沒有請求 過,只需從新請求更新location,並註冊監聽器以接收更新後的location信息。
LocationListener locationListener = new LocationListener() { @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } @Override public void onLocationChanged(Location location) { longitude = location.getLongitude(); latitude = location.getLatitude(); Log.d(TAG,"Location longitude:"+ longitude +" latitude: "+ latitude ); } }; mLocationManager.requestLocationUpdates(serviceProvider, 10000, 1, this);
而後你發現onLocationChanged永遠不會被調用,你仍然無法獲取定位信息。
其實在上面我已經提到了,全部上面的解決的方案都沒有解決根本問題,那就是當你在室內開發時,你的手機根本就無法獲取位置信息,你叫系統如何將位置信息通知給你的程序。因此要從根本上解決這個問題,就要解決位置信息獲取問題。剛剛也提到了,只有NETWORK_PROVIDER這種模式纔是室內定位可靠的方式,只不過因爲大陸的怪怪網絡,且大部分廠商也不會用google的服務,這種定位方式默認是無法用的。那怎麼辦?好辦,找個替代的服務商就能夠了,百度的位置信息sdk就能夠解決這個問題。它的基本原理在上面已經提到過了,就是蒐集你的wifi節點信息和你的手機基站信息來定位。