我为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)
我真的无法理解为什么会这样。很明显,我在运行connect方法并等待LocationClient
回调后尝试使用onConnected
获取最后一个已知位置,据我所知,onConnected
回调被调用时我有连接,那么如何获得"Not connected ..."
例外?
有人知道吗?
感谢。
答案 0 :(得分:3)
也许和我一样,你根本没有调用connect()。尝试使用onStart方法中包含的调用:
@Override
protected void onStart() {
super.onStart();
mGoogleApiClient.connect();
}
答案 1 :(得分:0)
我在Samsung 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);
}
}
答案 2 :(得分:0)
我试过了:
@Override
public void onConnected(Bundle arg0) {
Log.w(TAG, "onConnected");
if (!mLocationClient.isConnecting()) {
mLocationClient.getLastLocation();
}
}
到目前为止,它对我来说很好,但我完全不知道为什么。
答案 3 :(得分:0)
派对有点晚了,但万一有人偶然发现了这个问题。就我而言,我收到了与Emil相同的错误消息。经过一些调试后,我注意到(在我的具体代码中)我两次调用了mLocationClient.connect(),第二次调用了大约一点延迟。 100毫秒。我相信第一次调用导致onConnect()回调被触发,但第二次connect()调用打破了连接。
在我的情况下解决方案是在连接之前检查,如果还没有连接,类似于扩展范围建议它。我不确定为什么Google会在重复的connect()调用中断开mLocationClient,但在我的情况下,它解决了这个问题。
if (!mLocationClient.isConnected() && !mLocationClient.isConnecting()){
mLocationClient.connect();
}