Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 无法使用融合的位置API停止位置更新_Android_Location_Fusedlocationproviderapi - Fatal编程技术网

Android 无法使用融合的位置API停止位置更新

Android 无法使用融合的位置API停止位置更新,android,location,fusedlocationproviderapi,Android,Location,Fusedlocationproviderapi,嗨,我正在开发一个小的android应用程序,在这个应用程序中,我尝试使用融合的位置更新来获取位置更新。我试过以下方法: private void processStartLocation() { mGoogleApiClient.connect(); } @Override public void onConnected(Bundle bundle) { updateBooleanSharedPreference(this, "isLocationUpdatesOn", t

嗨,我正在开发一个小的android应用程序,在这个应用程序中,我尝试使用融合的位置更新来获取位置更新。我试过以下方法:

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)

我做错什么了吗。我需要一些帮助。谢谢。

看到关于删除给定挂起意图(
LocationPendingEvent
)的所有位置更新的错误投诉,因为
GoogleAppClient
未连接-也许您应该在拨打电话之前检查其连接状态:

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
    }
}

无法查看调用processStopLocation()的位置或时间,但该错误通常意味着processStopLocation()中使用的“mgoogleAppClient”对象已丢失对连接的Google Api客户端对象的引用。也许processStartLocation()中的Google Api客户端对象的setter和processStopLocation()中的getter可以工作。同样,如果不知道更新何时启动进程以及何时调用停止进程,则很难确定问题所在

何时/何地调用
processStopLocation()
?我首先尝试启动onConnect内部的更新,然后在一段时间后调用processStopLocation。在尝试取消更新之前,您是否至少获得了位置更新?您是否在代码中实现了
onLocationChanged
回调,这是您获取更新的地方吗?请检查本教程,看看您是否遗漏了任何内容—Hi Tasos在本例中,更新侦听器是活动本身。在我的例子中,我正在收听内部服务的更新,它们通过广播反馈给活动。我尝试了上述解决方案。但它只是绕过了停止位置更新的过程。在我的接收器的后台,我仍在获取更新。您的服务/活动实现了
LocationListener
,对吗?因此,或许可以尝试通过传递侦听器而不是LocationPendingEvent来停止位置更新。请参阅更新的答案。是的,您必须通过侦听器并将其值设置为null,以便您可以停止回拨。谢谢您的重播。是否有任何方法可以维护mGoogleAPiClient引用。将某些对象存储在何处,否则可以获取连接的对象引用。若我从后台关闭应用程序并再次启动它,我将面临同样的问题。然后重试以停止在后台运行的服务。在这里,我还需要传递mgoogleapiclientl,就像我说的对对象使用set()和get()方法一样。如果您使用类的新对象(与用于调用processStartLocation()的对象不同)从外部类或服务调用processStopLocation(),那么经过仔细考虑,您应该会发现这可能是引用丢失的原因。无论哪种方式,通过单独的类对对象使用get和set肯定会维护引用。