Android 定位

完全解決Android GPS無法定位這一頑固問題

時間 2014-06-17 07:58:09  CSDN博客java

原文  http://blog.csdn.net/itleaks/article/details/31511105android

主題 安卓開發git

        你們去網上搜索Android定位location爲null無法定位問題,估計有一大堆文章介紹如何來解決,可是最後你們發現基本沒用。本文將從Android定位實現原理來深刻分析無法定位緣由並提出真正的解決方案。在分析以前,咱們確定得先看看android官方提供的定位SDK。服務器

默認Android GPS定位實例

    獲取LocationManager:

mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    選擇Location Provider:

         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 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永遠不會被調用,你仍然無法獲取定位信息。

 

爲何就無法獲取到location呢?

         其實在上面我已經提到了,全部上面的解決的方案都沒有解決根本問題,那就是當你在室內開發時,你的手機根本就無法獲取位置信息,你叫系統如何將位置信息通知給你的程序。因此要從根本上解決這個問題,就要解決位置信息獲取問題。剛剛也提到了,只有NETWORK_PROVIDER這種模式纔是室內定位可靠的方式,只不過因爲大陸的怪怪網絡,且大部分廠商也不會用google的服務,這種定位方式默認是無法用的。那怎麼辦?好辦,找個替代的服務商就能夠了,百度的位置信息sdk就能夠解決這個問題。它的基本原理在上面已經提到過了,就是蒐集你的wifi節點信息和你的手機基站信息來定位。

真正的解決方案,使用百度位置定位SDK

相關文章
相關標籤/搜索