2017-04-04 23 views
0

我遇到了Android問題,即使用戶打開位置服務後,LocationManager仍然無法找到用戶位置。LocationManager仍然無法找到GPS開啓後的最後一個已知位置

在我開始需要使用用戶的位置我撥打下列活動:

//Menu Activity 
LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
if(lm.isProviderEnabled(LocationManager.GPS_PROVIDER){ 
    Intent nearby = new Intent(mActivityContext, NearbyActivity.class); 
    startActivity(nearby); 
}else{ 
    alertNoGps(); 
} 

一旦打開GPS附近的活動可以啓動,但的LocationManager仍然無法找到用戶的最後已知位置。我的相關代碼是:

//Nearby Activity 
try{ 
    LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
    if(location != null){ 
     ... 
    }else{ 
     Toast.makeText ... 
    } 
} catch(SecurityException e){ 
    e.printStackTrace(); 
} 

我目前正在測試的手機正在運行Android Marshmallow 6.0.1。如果在應用程序運行android studio之前GPS已經打開,那麼獲取最後一個已知位置是沒有問題的。只有當我在運行應用程序之前關閉GPS並在應用程序運行時將其打開時,我遇到了問題。 LocationManger造成這種情況呢?

編輯:另外在清單中,我有優良和粗略的位置權限。我不知道這是否是API 23及以上版本的問題,因爲需要額外的權限檢查,但我必須想象它們仍然由安全例外處理。

回答

0

有兩種不同的方式來檢索位置,一個是基於網絡,另一個是基於GPS服務。當然,基於GPS服務的位置總是更加準確。 根據文檔,可能需要一段時間才能使用GPS服務接收位置。在這種情況下,通過使用getLastKnownLocation()方法可以使用最後一個已知位置來獲取最近可用的位置。 在這裏,要獲取最後一個可用位置,您應該將 LocationManager.GPS_PROVIDER更改爲LocationManager.NETWORK_PROVIDER。

如果您希望接收基於GPS服務的準確實時位置信息,我建議您使用FusedLocationApi。 你可以在這裏找到它 https://developer.android.com/training/location/receive-location-updates.html

乾杯.. !!

0

這正是它應該如何工作。當Android被禁用時,Android會清除提供程序的最後一個已知位置,並且將返回null,直到爲該提供程序輪詢新點。

在你的情況下,我會建議,如果你得到空位置點爲GPS最後已知的位置,只是請求一次更新。

0

我發現類似於Pablo的回答,getLastKnownLocation()將被清除,因爲它是一個相當隨意的函數,可以經常返回null。如果GPS座標要求更高,那麼在嘗試獲取GPS座標並使用requestLocationUpdates()或Google的FusedLocationApi而非getLastKnownLocation()時應該更加有力。

所以,現在我使用FusedLocationApi與GoogleApiClient我使用內置:客戶端連接

client = new GoogleApiClient.Builder(mActivityContext) 
       .addApi(LocationServices.API) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 

後,我發現在onConnected()方法重寫它看起來像GPS定位:

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
Location location = LocationServices.FusedLocationApi.getLastLocation(client); 

這似乎是更可靠的找到GPS座標。

相關問題