GoogleApiClient löst "GoogleApiClient ist noch nicht verbunden" aus, nachdem die Funktion onConnected aufgerufen wurde

74

Also habe ich etwas gefunden, das mir über GoogleApiClient nicht sehr klar ist. GoogleApiClient verfügt über eine Funktion namens onConnected, die ausgeführt wird, wenn der Client verbunden ist (sicher).

Ich habe meine eigene Funktion namens startLocationListening, die schließlich in der onConnected- Funktion von GoogleApiClient aufgerufen wird.

Daher konnte meine startLocationListening-Funktion ohne eine GoogleApiClient-Verbindung nicht ausgeführt werden.

Code und Protokoll:

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

Die Ausnahme ist:

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)

...

Mein Debug-Protokoll besagt auch, dass die onConnected-Funktion aufgerufen wurde :

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

Danach habe ich die Ausnahme bekommen.

Vermisse ich hier etwas? Ich habe eine Antwort für "verbunden" erhalten. Ich habe meine Funktion ausgeführt und den Fehler "nicht verbunden" erhalten. Was ist das? Außerdem ist eine nervige Sache: Ich habe diesen Ortungsdienst seit Wochen genutzt und diesen Fehler nie erhalten.

EDIT:

Ich habe eine spezifischere Protokollausgabe hinzugefügt, habe mich einfach umgehauen und dies überprüft:

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

Protokollausgabe in diesem Fall:

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.

Ja, ich bin gerade mGoogleApiClient.isConnected() == falsereingekommen, onConnected()wie ist das möglich?

BEARBEITEN:

Da dies selbst mit Reputationsprämie nicht beantwortet werden konnte, habe ich beschlossen, dies als Fehler bei Google zu melden. Was als nächstes kam, war für mich wirklich überraschend. Googles offizielle Antwort auf meinen Bericht:

"Diese Website ist für Entwicklerprobleme mit dem AOSP-Android-Quellcode und dem Entwickler-Toolset gedacht, nicht für Google-Apps oder -Dienste wie Play-Dienste, GMS oder Google-APIs. Leider scheint es keinen geeigneten Ort zu geben, um Fehler mit Play-Diensten zu melden Ich kann nur sagen, dass es sich bei dieser Website nicht um eine Entschuldigung handelt. Versuchen Sie stattdessen, in den Google-Produktforen zu posten. "

Vollständiger Issue- Bericht hier. (Ich hoffe, sie werden es nicht entfernen, nur weil es albern ist)

Also ja, ich habe mir die Google-Produktforen angesehen und konnte einfach kein Thema finden, um dieses Ding zu posten. Im Moment bin ich verwirrt und stecke fest.

Kann mir jemand auf dem Planeten Erde dabei helfen?

BEARBEITEN:

Vollständiger Code im Pastebin

Adam Varhegyi
quelle
Könnten Sie auch onConnectionSuspended () eine Protokollierung hinzufügen, um zu sehen, ob diese zu irgendeinem Zeitpunkt aufgerufen wird?
Anti Veeranna
@AntiVeeranna Ich habe mich auch bei onConnectionSuspended () angemeldet, da diese Funktion nie aufgerufen wurde.
Adam Varhegyi
Könnten Sie auch den Code veröffentlichen, der mGoogleApiClient erstellt?
Anti Veeranna
@ AntiVeeranna Code in Pastebin hinzugefügt
Adam Varhegyi
1
@Dima, wie iheanyi sagte "Versuchen Sie, Ihre googleApiClient-Erstellung auf onCreate zu verschieben, und prüfen Sie, ob Sie dasselbe Verhalten erhalten." Es wird sichergestellt, dass nur eine Instanz von googleApiClient stammt und Ihr Dienst keine falschen Referenzen mehr enthält.
Adam Varhegyi

Antworten:

85

Ich habe gerade bemerkt, dass Sie den googleApiClient in onStartCommand () erstellen. Das scheint eine schlechte Idee zu sein.

Angenommen, Ihr Dienst wird zweimal ausgelöst. Es werden zwei googleApiClient-Objekte erstellt, auf die Sie jedoch nur verweisen. Wenn derjenige, dessen Referenz Sie nicht haben, seinen Rückruf an onConnected () ausführt, werden Sie in diesem Client verbunden, aber der Client, dessen Referenz Sie tatsächlich haben, kann immer noch nicht verbunden sein.

Ich vermute, das ist was los ist. Versuchen Sie, Ihre googleApiClient-Erstellung auf onCreate zu verschieben, und prüfen Sie, ob Sie dasselbe Verhalten erhalten.

iheanyi
quelle
Ja, ich denke du hast das richtig verstanden! developer.android.com/reference/android/app/…
EyesClear
Hallo @iheanyi. Ich erstelle mein "googleApiClient" -Objekt mit der onCreate () -Methode meiner MainActivity. Aber ich bekomme diesen Fehler auf einigen Geräten. Was können Sie dazu sagen?
Sattar Hummatli
@SattarHummatli Es ist schwer zu sagen. Die Situation in dieser Frage ist wahrscheinlich nicht die einzige Möglichkeit, wie jemand mit diesem Fehler enden kann. Ich würde zuerst überprüfen, ob Sie keine ähnliche Rennbedingung haben. Stellen Sie beispielsweise sicher, dass Sie den googleApiClient nur an einem Ort erstellen. Wenn Sie immer noch ein Problem haben, versuchen Sie, ein minimales vollständiges und überprüfbares Codebeispiel zusammenzustellen und eine Frage zu stellen. Dann antworte mir mit einem Kommentar mit einem Link und ich werde einen Blick darauf werfen.
Iheanyi
2

Ich hatte den gleichen Fehler, aber mein Problem war anders als die Antwort von iheanyl:

Ich hatte den googleApiClient als statisch deklariert. Dies verhinderte, dass Android den Dienst herunterfuhr.

Paamand
quelle
2

Ich hatte dieses Problem und habe es gelöst, indem ich googleApiClient als statisches Objekt deklariert habe

Amine Choukri
quelle
0

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

Sie sollten ein Clientobjekt in der onCreate (Bundle) -Methode Ihrer Aktivität instanziieren und dann connect () in onStart () undconnect () in onStop () aufrufen, unabhängig vom Status.

Die Implementierung von GoogleApiClient scheint nur für eine einzelne Instanz ausgelegt zu sein. Es ist am besten, es nur einmal in onCreate zu instanziieren und dann Verbindungen und Trennungen mit der einzelnen Instanz durchzuführen.

Naveen Kumar M.
quelle
0

Rufen Sie die Methode connect () in der Methode onStart () auf

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

quelle
0

Ich glaube, ich habe die Wurzel des Problems gefunden und es hat nichts mit der API zu tun. Ich habe dies jedes Mal gesehen, wenn ich die App installiere. Übrigens habe ich genau wie der beliebteste Kommentar nur einen googleApiClient nach Pause und Lebenslauf. Was mir aufgefallen ist, dass die Berechtigungsanforderung zum Abrufen des Geolocation-Zugriffs angezeigt wird. Wie Sie in Ihrer Aktivität wissen, wird dies zu einer Pause, und sobald das Popup verschwunden ist, wird Ihre Aktivität fortgesetzt. Höchstwahrscheinlich ist Ihr GoogleClient auch an diese Ereignisse gekettet, um die Verbindung zu trennen und eine Verbindung herzustellen. Sobald die Berechtigung akzeptiert wurde und Sie die Aufgabe googleApiClient ausführen, können Sie feststellen, dass keine Verbindung besteht.

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

Sie können das Trennen und Verbinden überspringen, wenn Sie ein Flag setzen, das vor der Berechtigung wahr ist und sobald die googleApiClient-Aufgabe abgeschlossen oder grantedfalsch ist.

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

Wir könnten auch die Erlaubnis alleine teilen und, wenn dies gewährt wird, den Task-Aufruf durchführen. Ok, ich werde gestehen, dass ich ein Fragment verwende, und ich habe die App neu installiert, sogar den Bildschirm nach Berechtigungen gedreht und nach Erteilung wurde das Ergebnis angezeigt. Ich hoffe das hilft anderen Menschen.

  • Sie müssen die App nicht deinstallieren. Gehen Sie einfach zu Einstellung / Anwendungsmanager / Ihre App / Berechtigungen und deaktivieren Sie alle, und testen Sie die App erneut.
Juan Mendez
quelle
0

Durch das Verschieben von GoogleApiClient von onStartCommand nach onCeate wurde mein Problem behoben

Venkatesh Prathipati
quelle
-1

Ich hatte dieses Problem, als ich versehentlich aber googleApiClient.connect () in oncreate und onresume. Einfach von oncreate entfernt.

Tooroop
quelle
-4

Durch das Verschieben der googleApi-Erstellung nach onCreate wurde das Problem für mich behoben.

user2956331
quelle
9
Das Wiederholen der akzeptierten Antwort ist für niemanden nützlich, Sie erzeugen nur Lärm
Tim