5

我有这个onConnected回调实现Google LocationClient API

@Override
public void onConnected(Bundle arg0) {
    if (lc != null) {
        lastKnownLocation = lc.getLastLocation();
        LocationRequest request = new LocationRequest();
        request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        request.setFastestInterval(MIN_TIME_BETWEEN_LOCATION_UPDATES);
        request.setSmallestDisplacement(MIN_DISTANCE_BETWEEN_LOCATION_UPDATES);
        lc.requestLocationUpdates(request, ll);
    }
}

出于某种原因,有时这行:

lastKnownLocation = lc.getLastLocation();

给了我这个例外:

java.lang.IllegalStateException: Not connected. Call connect() and wait for onConnected() to be called.
   at com.google.android.gms.internal.de.bc()
   at com.google.android.gms.internal.ez.a()
   at com.google.android.gms.internal.ez$c.bc()
   at com.google.android.gms.internal.ey.getLastLocation()
   at com.google.android.gms.internal.ez.getLastLocation()
   at com.google.android.gms.location.LocationClient.getLastLocation()
   at com.citylifeapps.cups.helputils.UserLocation.onConnected(UserLocation.java:115)
   at com.google.android.gms.internal.de.aZ()
   at com.google.android.gms.internal.de$f.a()
   at com.google.android.gms.internal.de$f.a()
   at com.google.android.gms.internal.de$b.be()
   at com.google.android.gms.internal.de$a.handleMessage()
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:157)
   at android.app.ActivityThread.main(ActivityThread.java:5356)
   at java.lang.reflect.Method.invokeNative(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:515)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
   at dalvik.system.NativeStart.main(NativeStart.java)

我真的不明白为什么会这样。显然,我正在尝试使用LocationClient在运行连接方法并等待onConnected回调之后获取最后一个已知位置,据我所知,onConnected当我有连接时会调用回调,那么我怎样才能得到"Not connected ..."异常呢?有人知道吗?

谢谢。

4

4 回答 4

3

也许像我一样,你根本没有调用 connect() 。尝试使用 onStart 方法中包含的调用:

@Override
protected void onStart() {
    super.onStart();
    mGoogleApiClient.connect();
}
于 2015-01-03T04:18:01.633 回答
0

我试过这个:

@Override
public void onConnected(Bundle arg0) {
    Log.w(TAG, "onConnected");
    if (!mLocationClient.isConnecting()) {
        mLocationClient.getLastLocation();
    }
}

到目前为止,它对我来说很好,但我完全不知道为什么。

于 2014-06-25T15:59:14.590 回答
0

我在三星 S4 和 S3 mini 上有同样的问题。

只需使用 try/catch getLastLocation() 包装并开始从 requirstLocationUpdate 获取实际位置:

@Override
public void onConnected(Bundle arg0) {
    if (lc != null) {
        try{   
           lastKnownLocation = lc.getLastLocation();
        catch(Exception ex){ /* log error */ }

        LocationRequest request = new LocationRequest();
        request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        request.setFastestInterval(MIN_TIME_BETWEEN_LOCATION_UPDATES);
        request.setSmallestDisplacement(MIN_DISTANCE_BETWEEN_LOCATION_UPDATES);
        lc.requestLocationUpdates(request, ll);
    }
}
于 2014-04-30T17:05:48.847 回答
0

聚会有点晚了,但以防万一有人也遇到这个问题。就我而言,我收到了与 Emil 相同的错误消息。经过一些调试后,我注意到(在我的特定代码中)我调用了 mLLocationClient.connect() 两次,第二次延迟了大约。100 毫秒。我相信第一次调用导致 onConnect() 回调被触发,但随后第二次 connect() 调用中断了连接。

在我的情况下,解决方案是在连接之前检查,如果还没有连接,类似于上面的扩展范围建议。我不确定 Google 为什么会在重复的 connect() 调用中断开 mLLocationClient 的连接,但在我的情况下它解决了问题。

if (!mLocationClient.isConnected() && !mLocationClient.isConnecting()){
    mLocationClient.connect();
}
于 2014-11-11T20:17:25.520 回答