2016-09-25 87 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