2016-09-25 91 views
0

嗨,我正在開發小型Android應用程序,我嘗試使用融合位置更新來獲取位置更新。我試圖用以下方式:無法停止使用融合位置API的位置更新

private void processStartLocation() { 
    mGoogleApiClient.connect(); 
} 

@Override 
public void onConnected(Bundle bundle) { 

    updateBooleanSharedPreference(this, "isLocationUpdatesOn", true); 
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, locationPendingIntent); 

    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
    if (mLastLocation != null) { 
     lat = String.valueOf(mLastLocation.getLatitude()); 
     lon = String.valueOf(mLastLocation.getLongitude()); 
     time = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss.SSS").format(new Date(mLastLocation.getTime())); 
     updateUI(); 
    } 
} 

private void processStopLocation() { 

    LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, locationPendingIntent); 
} 

所以一切工作正常。我能夠收到我的更新。但是,當我嘗試停止更新時,我得到以下問題:

java.lang.IllegalStateException: GoogleApiClient is not connected yet. 
at com.google.android.gms.internal.zzlh.zzb(Unknown Source) 
at com.google.android.gms.internal.zzli.zzb(Unknown Source) 
at com.google.android.gms.location.internal.zzd.removeLocationUpdates(Unknown Source) 

我做錯了什麼。需要一些幫助。謝謝。

+0

您何時/在哪裏調用'processStopLocation()'? – ishmaelMakitla

+0

我試着先在onConnect裏面進行更新,然後在一段時間後我調用了processStopLocation。 – nilkash

+0

您是否至少在嘗試取消更新之前獲取位置更新?你在你的代碼中實現了'onLocationChanged'回調,並且這是你獲取更新的地方嗎? – ishmaelMakitla

回答

1

眼看要消除對於給定的未決意圖(locationPendingIntent),因爲GoogleApiClient沒有連接所有的位置更新錯誤的投訴 - 也許你應該在進行調用之前檢查它的連接狀態:

private void processStopLocation() { 
    if(mGoogleApiClient !=null){ 
     LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
    } 
    else{ 
    //no need to stop updates - we are no longer connected to location service anyway 
    } 
} 
+0

我試過以上解決方案。但它只是繞過停止位置更新的過程。在我的接收器裏面的背景中,我仍然得到更新。 – nilkash

+0

您的服務/活動實現了'LocationListener',對吧?因此,可以嘗試通過傳遞偵聽器而不是locationPendingIntent來停止位置更新。查看更新的答案。 – ishmaelMakitla

+0

是的,你必須通過監聽,並將其值設置爲空,所以你可以停止回電 – Priya

0

無法查看您在何處或何時調用processStopLocation(),但該錯誤通常表示您在processStopLocation()中使用的'mGoogleApiClient'對象已失去對連接的Google Api客戶端對象的引用。可能是processStartLocation()中的Google Api Client對象的setter和processStopLocation()中的getter可以工作。再次不知道更新開始過程何時以及什麼時候停止過程被調用,很難指出問題

+0

嗨Vikrant感謝您的重播。有沒有辦法維護mGoogleAPiClient參考。要麼存儲一些地方,要麼可以獲得連接的對象引用。如果我從後臺關閉應用程序並重新啓動應用程序,我面臨同樣的問題。然後再次嘗試停止在後臺運行的服務。還有我需要傳遞mGoogleApiClient – nilkash

+0

就像我說的那樣,在對象上使用set()和get()方法。這應該將你排除出 – badrobot15

+0

第二個想法是,如果您使用類的新對象調用processStopLocation()從外部類或服務調用processStartLocation()的對象,那可能是參考正在迷失。無論哪種方式,通過一個單獨的類使用獲取和設置對象將肯定會保持參考。 – badrobot15