Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> Android開發教程 >> 如何解決Android GPS沒法定位的問題

如何解決Android GPS沒法定位的問題

編輯:Android開發教程

大家去網上搜索Android定位location為null沒法定位問題,估計有一大堆文章介紹如何來解決,但是最後大家發現基本沒用。本文將從Android定位實現原理來深入分析沒法定位原因並提出真正的解決方案。在分析之前,我們肯定得先看看android官方提供的定位SDK。

默認Android GPS定位實例

獲取LocationManager:

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

選擇Location Provider:

Android系統存在多種provider,分別是

GPS_PROVIDER:

這個就是手機裡有GPS芯片,然後利用該芯片就能利用衛星獲得自己的位置信息。但是在室內,GPS定位基本沒用,很難定位的到。

NETWORK_PROVIDER:

這個就是利用網絡定位,通常是利用手機基站和WIFI節點的地址來大致定位位置,

這種定位方式取決於服務器,即取決於將基站或WIF節點信息翻譯成位置信息的服務器的能力。由於目前大部分Android手機沒有安裝google官方的location manager庫,大陸網絡也不允許,即沒有服務器來做這個事情,自然該方法基本上沒法實現定位。

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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved