Не подключен. Вызовите Connect или подождите, пока onConnected() вызовет исключение внутри onConnected?

У меня реализован обратный вызов 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 ..."? Кто-нибудь знает?

Спасибо.


person Emil Adz    schedule 12.04.2014    source источник
comment
Вы уже знаете, что здесь происходит?   -  person Steve Benett    schedule 29.06.2014
comment
Привет, Эмиль Адз. Вы решили эту проблему? Я тоже сталкиваюсь с той же проблемой последние два дня. Если вы решили, пожалуйста, помогите мне, как я могу решить эту проблему   -  person Murali Ganesan    schedule 19.11.2014


Ответы (4)


Возможно, как и я, вы вообще не вызывали connect(). Попробуйте с вызовом, включенным в метод onStart:

@Override
protected void onStart() {
    super.onStart();
    mGoogleApiClient.connect();
}
person sethi.anuj    schedule 03.01.2015
comment
Ага. Документ Android забыл упомянуть, что вы должны подключиться. TT_TT - person Nestor Ledon; 04.03.2015
comment
Это абсолютно верно и до сих пор не исправлено в документации по Android. Следование учебнику 1: 1 подведет вас! - person avalancha; 11.03.2015

У меня такая же проблема на самсунгах 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);
    }
}
person Imaginary    schedule 30.04.2014
comment
Нет, это не так просто, перенос этой строки на try and catch может устранить сбои, но многие мои пользователи жалуются на проблемы с определением местоположения. Так что это не решает мою проблему. - person Emil Adz; 22.05.2014
comment
обычно он зависает только при получении последнего местоположения, но вы можете получить фактическое местоположение. - person Imaginary; 11.06.2014

Я пробовал это:

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

Пока это работает нормально для меня, но я абсолютно не знаю, почему.

person Tamaki Sakura    schedule 25.06.2014

Немного опоздал на вечеринку, но на всякий случай, если кто-то тоже столкнется с этой проблемой. В моем случае я получил то же сообщение об ошибке, что и Эмиль. После некоторой отладки я заметил, что (в моем конкретном коде) я дважды вызывал mLocationClient.connect(), второй раз с небольшой задержкой ок. 100 миллисекунд. Я считаю, что первый вызов вызвал запуск обратного вызова onConnect(), но затем второй вызов connect() разорвал соединение.

Решение в моем случае состояло в том, чтобы проверить перед подключением, если соединение еще не установлено, подобно тому, как это предлагает расширенный диапазон выше. Я не уверен, почему Google отключает mLocationClient при повторном вызове connect(), но в моем случае это решило проблему.

if (!mLocationClient.isConnected() && !mLocationClient.isConnecting()){
    mLocationClient.connect();
}
person peitek    schedule 11.11.2014