GoogleApiClient rzuca "GoogleApiClient nie jest jeszcze podłączony" po wywołaniu funkcji onConnected

Więc znalazłem coś, co nie jest dla mnie bardzo jasne o GoogleApiClient. GoogleApiClient posiada funkcję o nazwie onConnected , która jest uruchamiana, gdy klient jest podłączony (na pewno)

Mam własną funkcję o nazwie: startLocationListening która w końcu zostaje wywołana na funkcji Onconnected GoogleApiClient.

Więc moja funkcja startLocationListening nie mogła działać bez GoogleApiClient połączenie.

Kod i dziennik:

@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);
   }

Wyjątkiem jest:

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)

...

Mój dziennik debugowania również mówi onconnected funkcja została wywołana :

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

Po tym dostałem wyjątek.

Czy coś mi umknęło? Dostałem odpowiedź na "podłączony" uruchomiłem mój func i dostałem błąd "nie podłączony" co to jest? Plus jedna irytująca rzecz: korzystałem z tej usługi lokalizacyjnej od tygodni i nigdy nie dostałem tego błąd.

E D I T:

Dodałem bardziej szczegółowe wyjście dziennika, po prostu rozwalił mi umysł, zobacz to:

@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();
    }

Wyjście dziennika w tym przypadku:

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.

Tak, właśnie dostałem mGoogleApiClient.isConnected() == false wewnątrz onConnected() Jak to możliwe?

E D I T:

Ponieważ nikt nie mógł odpowiedzieć na to nawet z reputation bounty, postanowiłem zgłosić to jako błąd do Google. to, co było następne, naprawdę mnie zaskoczyło. Oficjalna odpowiedź Google na mój raport:

" ta strona jest dla programistów problemy ze źródłem AOSP Android kod i zestaw narzędzi programistycznych, a nie Google apps czy usługi takie jak Usługi Play, GMS lub interfejsy API Google. Niestety nie wydaje się bądź odpowiednim miejscem do zgłaszania błędów w serwisach Play. All I can say is that this website isn ' t it, sorry. Spróbuj zamieścić w Google Forum produktowe. "

Pełny numer zgłoś się tutaj. (mam nadzieję, że nie usuną go tylko dlatego, że jego silly)

Więc tak, spojrzałem na fora produktów Google i po prostu nie mogłem znaleźć żadnego tematu, aby to opublikować, więc w tej chwili jestem zdziwiony i zatrzymany.

czy ktoś z planety Ziemia mógłby mi w tym pomóc?

E D I T:

Pełny kod w pastebin

Author: Adam Varhegyi, 2015-03-30

8 answers

Właśnie zauważyłem, że tworzysz googleApiClient w onstartcommand (). To zły pomysł.

Załóżmy, że usługa zostanie uruchomiona dwa razy. Dwa obiekty googleApiClient zostaną utworzone, ale będziesz miał tylko odniesienie do jednego. Jeśli ten, którego referencji nie masz, wykona wywołanie zwrotne do onconnected (), zostaniesz połączony w tym kliencie, ale klient, którego referencji faktycznie masz, może nadal być odłączony.

Podejrzewam, że to właśnie dalej. Spróbuj przenieść tworzenie googleApiClient do onCreate i sprawdź, czy masz takie samo zachowanie.

 79
Author: iheanyi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-03 22:55:57

Miałem ten sam błąd, ale mój problem był inny od odpowiedzi iheanyl:

Stwierdziłem, że googleApiClient jest statyczny. Uniemożliwiło to Androidowi zamknięcie usługi.

 2
Author: Paamand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-29 14:19:34

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

Należy utworzyć instancję obiektu Klienta w metodzie OnCreate(Bundle) swojej aktywności, a następnie wywołać connect() w OnStart() i disconnect() w onStop (), niezależnie od stanu.

Implementacja GoogleApiClient wydaje się przeznaczona tylko dla pojedynczej instancji. Najlepiej utworzyć go tylko raz w onCreate, a następnie wykonać połączenia i rozłączenia przy użyciu pojedynczej instancji.

 0
Author: Naveen Kumar M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-19 04:35:55

Wywołanie metody connect()w metodzie 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();
       }
 0
Author: user555,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-22 14:25:02

Myślę, że znalazłem źródło problemu i nie ma to nic wspólnego z API. Miałem do czynienia z tym wydanym za każdym razem, gdy instaluję aplikację. Swoją drogą tak jak najbardziej popularny komentarz mam tylko jeden googleApiClient przy pauzie i wznowieniu. Zauważyłem, że pojawia się prośba o pozwolenie na dostęp do geolokalizacji. Jak wiesz w swojej aktywności to zamieni się w pauzę, a gdy wyskakujące okienko zniknie, wznowi Twoją aktywność. Najprawdopodobniej twój googleClient jest również przykuty do tych zdarzenia do rozłączenia i połączenia. Możesz powiedzieć, że nie ma połączenia po zaakceptowaniu pozwolenia i masz zamiar wykonać zadanie 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
                    }
                });
    }

Możesz pominąć rozłączanie i łączenie, ustawiając flagę, która jest prawdziwa przed uprawnieniem i po zakończeniu zadania googleApiClient lub granted jest false.

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

Możemy również podzielić robiąc pozwolenie samodzielnie, a jeśli przyznane, to wykonać wywołanie zadania. Ok, przyznam się, że używam fragmentu i ponownie zainstalować aplikację nawet obrócił ekran na uprawnienia i raz przyznane, wynik pojawił się. Mam nadzieję, że to pomoże innym ludziom.

    Nie musisz odinstalowywać aplikacji. Po prostu przejdź do Ustawienia / Menedżer aplikacji/Twoja aplikacja / uprawnienia i wyłącz dowolne, a następnie przetestuj aplikację ponownie.
 0
Author: Juan Mendez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-02 05:13:09

Miałem ten problem i rozwiązałem go deklarując googleApiClient jako obiekt statyczny

 0
Author: Amine Choukri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-20 16:34:40

Miałem ten problem, gdy przypadkowo ale googleApiClient.connect() w oncreate i onresume. Po prostu usunąłem go z oncreate.

 -1
Author: Tooroop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-31 07:03:51

Przeniesienie tworzenia googleApi do onCreate rozwiązało problem dla mnie.

 -4
Author: user2956331,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-16 19:36:13