GoogleApiClient бросает "GoogleApiClient еще не подключен" ПОСЛЕ ONConnected функция вызова

Итак, я нашел кое-что, что мне не очень понятно о GoogleApiClient. GoogleApiClient имеет функцию onConnected, которая запускается, когда клиент подключен (наверняка)

Я получил свою собственную функцию: startLocationListening, которая в конечном итоге получает вызов функции GoogleApiClient onConnected.

Итак, моя функция startLocationListening не могла работать без соединения GoogleApiClient.

Код и журнал:

@Override
public void onConnected(Bundle bundle) {
    log("Google_Api_Client:connected.");
    initLocationRequest();
    startLocationListening(); //Exception caught inside this function
}

...

private void startLocationListening() {
    log("Starting_location_listening:now");

    //Exception caught here below:
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
   }

Исключение составляет:

03-30 12:23:28.947: E/AndroidRuntime(4936):     java.lang.IllegalStateException: GoogleApiClient is not connected yet.
03-30 12:23:28.947: E/AndroidRuntime(4936):     at com.google.android.gms.internal.jx.a(Unknown Source)
03-30 12:23:28.947: E/AndroidRuntime(4936):     at com.google.android.gms.common.api.c.b(Unknown Source)
03-30 12:23:28.947: E/AndroidRuntime(4936):     at com.google.android.gms.internal.nf.requestLocationUpdates(Unknown Source)
03-30 12:23:28.947: E/AndroidRuntime(4936):     at hu.company.testproject.service.GpsService.startLocationListening(GpsService.java:169)
03-30 12:23:28.947: E/AndroidRuntime(4936):     at hu.company.testproject.service.GpsService.onConnected(GpsService.java:259)

...

В моем журнале отладки также говорится, что функция onConnected получила вызов:

03-30 12:23:28.847: I/Locationing_GpsService(4936): Google_Api_Client:connected.
03-30 12:23:28.857: I/Locationing_GpsService(4936): initLocationRequest:initing_now
03-30 12:23:28.877: I/Locationing_GpsService(4936): initLocationRequest:interval_5000
03-30 12:23:28.897: I/Locationing_GpsService(4936): initLocationRequest:priority_100
03-30 12:23:28.917: I/Locationing_GpsService(4936): Starting_location_listening:now

После этого я получил исключение.

Я что-то упустил? Я получил ответ на "подключен", я запустил мой func, и я получил ошибку "не подключен", что это? Плюс одна раздражающая вещь: я использовал эту службу определения местоположения в течение нескольких недель и никогда не получал эту ошибку.

E D я T:

Я добавил более конкретный вывод журнала, просто взорвал мой разум, проверьте это:

@Override
    public void onConnected(Bundle bundle) {

        if(mGoogleApiClient.isConnected()){
            log("Google_Api_Client: It was connected on (onConnected) function, working as it should.");
        }
        else{
            log("Google_Api_Client: It was NOT connected on (onConnected) function, It is definetly bugged.");
        }

        initLocationRequest();
        startLocationListening();
    }

вывод журнала в этом случае:

03-30 16:20:00.950: I/Locationing_GpsService(16608): Google_Api_Client:connected.
03-30 16:20:00.960: I/Locationing_GpsService(16608): Google_Api_Client: It was NOT connected on (onConnected) function, It is definetly bugged.

Да, я просто получил mGoogleApiClient.isConnected() == false внутри onConnected(), как это возможно?

E D я T:

Так как никто не мог ответить на это даже с благодарностью за репутацию, , я решил сообщить об этом как об ошибке для Google. То, что было дальше, действительно меня удивило. Официальный ответ Google на мой отчет:

"Этот веб-сайт предназначен для разработчиков с помощью источника AOSP для Android код и набор инструментов разработчика, а не приложения или службы Google, такие как Службы воспроизведения, GMS или API Google. К сожалению, похоже, быть подходящим местом для сообщения об ошибках в Play Services. Все, что я могу скажите, что этот сайт не так, извините. Попробуйте опубликовать в Google Форум продуктов."

Полный выпуск отчет здесь. (Надеюсь, они не удалят его только потому, что его глупо)

Итак, я посмотрел на Google Product Forums и просто нашел какую-либо тему для публикации этой вещи, поэтому на данный момент ям озадачен и застрял.

Может ли кто-нибудь на планете Земля помочь мне с этим?

E D я T:

Полный код в pastebin

Ответ 1

Я только заметил, что вы создаете googleApiClient в onStartCommand(). Это кажется плохой идеей.

Скажем, что ваш сервис запускается дважды. Два объекта googleApiClient будут созданы, но вы будете иметь только ссылку на один. Если тот, чья ссылка у вас нет, выполняет обратный вызов onConnected(), вы будете подключены к этому клиенту, но клиент, чья ссылка, которую вы действительно делаете, все еще может быть отключена.

Я подозреваю, что происходит. Попробуйте переместить создание googleApiClient в onCreate и посмотреть, получилось ли у вас одинаковое поведение.

Ответ 2

У меня была такая же ошибка, но моя проблема отличалась от iheanyl ответа:

Я объявил статику googleApiClient. Это помешало андроиду отключить службу.

Ответ 3

https://developer.android.com/reference/com/google/android/gms/common/api/GoogleApiClient.html

Вы должны создать экземпляр объекта клиента в методе Activity onCreate (Bundle), а затем вызвать connect() в onStart() и отключить() в onStop() независимо от состояния.

Реализация GoogleApiClient создается только для одного экземпляра. Лучше всего создать экземпляр только один раз в onCreate, а затем выполнить соединения и отключения, используя один экземпляр.

Ответ 4

вызов метода connect() в методе onStart()

 @Override
       protected void onStart() {
           super.onStart();

           // Call GoogleApiClient connection when starting the Activity
           googleApiClient.connect();
       }

       @Override
       protected void onStop() {
           super.onStop();

           // Disconnect GoogleApiClient when stopping Activity
           googleApiClient.disconnect();
       }

Ответ 5

Я думаю, что нашел корень проблемы и не имеет никакого отношения к API. Я столкнулся с этим каждый раз, когда устанавливаю приложение. Кстати, как и самый популярный комментарий, у меня есть только один googleApiClient после паузы и возобновления. Я заметил, что появляется запрос на получение доступа к геолокации. Как вы знаете, в вашей деятельности это превратится в паузу, и как только всплывающее окно исчезнет, ​​оно возобновит вашу деятельность. Скорее всего, ваш googleClient также привязан к этим событиям для отключения и подключения. Вы можете сказать, что после получения разрешения соединение отсутствует, и вы собираетесь выполнить задачу googleApiClient.

 if(googleApiClient.isConnected()){

        rxPermissions
                .request(Manifest.permission.ACCESS_FINE_LOCATION)
                .subscribe(granted -> {

                 if (granted) {
                        //here it could be client is already disconnected!!     
                        _geolocateAddress(response);
                    } else {
                        // Oups permission denied
                    }
                });
    }

Вы можете пропустить отсоединение и соединение, когда вы устанавливаете флаг, который является истинным до разрешения и после завершения задачи googleApiClient или granted является ложным.

if(googleApiClient.isConnected()){
        isRequestingPermission = true;
        rxPermissions
                .request(Manifest.permission.ACCESS_FINE_LOCATION)
                .subscribe(granted -> {
                    if (granted && googleApiClient.isConnected()) {
                        //Once the task succeeds or fails set flag to false
                        //at _geolocateAddress
                        _geolocateAddress(response);
                    } else {
                        // Oups permission denied
                        isRequestingPermission = false;
                    }
                });
    }

Мы могли бы также разделить разрешение на использование, и если оно было предоставлено, то вызовите вызов задачи. Хорошо, я собираюсь признаться, что использую фрагмент, и я переустановил приложение, даже повернув экран на разрешениях и однажды предоставив результат. Надеюсь, это поможет другим людям.

  • Вам не нужно удалять приложение. Просто перейдите к настройкам/менеджеру приложений/вашим приложениям/разрешениям и отключите их, а затем снова проверьте приложение.

Ответ 6

У меня была эта проблема, и я решил ее с объявлением googleApiClient как статического объекта

Ответ 7

У меня была эта проблема, когда я случайно, но googleApiClient.connect() в oncreate и onresume. Просто удалил его из oncreate.

Ответ 8

перемещение создания googleApi в onCreate разрешило проблему для меня.