web-dev-qa-db-de.com

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

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

Ich habe meine eigene Funktion mit dem Namen: startLocationListening , die schließlich bei GoogleApiClient onConnected aufgerufen wird Funktion.

Daher konnte meine startLocationListening-Funktion nicht ohne eine GoogleApiClient-Verbindung 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)

...

In meinem Debug-Protokoll steht auch, dass die Funktion onConnected 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 Funkverbindung gestartet und die Fehlermeldung "Nicht verbunden" erhalten. Was ist das? Außerdem ist es ärgerlich, dass ich diesen Ortungsdienst seit Wochen nutze und diesen Fehler nie bekommen habe.

E D I T:

Ich habe eine spezifischere Protokollausgabe hinzugefügt.

@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 habe gerade mGoogleApiClient.isConnected() == false inside onConnected() Wie ist es möglich?

E D I T:

Da dies auch mit Reputationsprämie niemand beantworten konnte, entschloss ich mich, dies als Fehler an Google zu melden. Was als nächstes kam, hat mich wirklich überrascht. Googles offizielle Antwort auf meinen Bericht:

"Diese Website ist für Entwickler gedacht, die Probleme mit dem AOSP Android= Quellcode und dem Entwickler-Toolset haben, nicht mit Google Apps oder Diensten wie Play-Diensten, GMS oder Google APIs. Leider scheint es keine zu geben Ein geeigneter Ort, um Fehler mit Play Services zu melden. Ich kann nur sagen, dass dies nicht der Fall ist. Versuchen Sie stattdessen, in den Google-Produktforen zu veröffentlichen.

Vollständige Ausgabe 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 kein Thema finden, um dieses Thema zu veröffentlichen. Im Moment bin ich verwirrt und stecke fest.

Kann mir jemand auf dem Planeten Erde dabei helfen?

E D I T:

Vollständiger Code in Pastebin

74
Adam Varhegyi

Mir ist gerade aufgefallen, 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, Sie haben jedoch nur einen Verweis. Wenn derjenige, dessen Referenz Sie nicht haben, seinen Rückruf zu onConnected () ausführt, werden Sie in diesem Client verbunden, aber der Client, dessen Referenz Sie tatsächlich haben, könnte 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.

85
iheanyi

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.

2
Paamand

Ich hatte dieses Problem und löste es, indem ich googleApiClient als statisches Objekt deklarierte

1
Amine Choukri

Ich denke, ich habe die Wurzel des Problems gefunden und es hat nichts mit der API zu tun. Ich habe dies jedes Mal ausgestellt, wenn ich die App installiere. Übrigens habe ich genau wie der beliebteste Kommentar nur einen googleApiClient, wenn ich pausiere und wieder aufnehme. Mir ist aufgefallen, dass die Erlaubnis zum Abrufen des Geolocation-Zugriffs angezeigt wird. Wie Sie in Ihrer Aktivität wissen, wird dies zu einer Pause, und sobald das Popup ausgeblendet ist, wird Ihre Aktivität fortgesetzt. Höchstwahrscheinlich ist Ihr googleClient auch an diese Ereignisse gekettet, um die Verbindung zu trennen und herzustellen. Sie können feststellen, dass keine Verbindung besteht, sobald die Berechtigung akzeptiert wurde und Sie im Begriff sind, die googleApiClient-Aufgabe auszuführen.

 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 Erlaubnis wahr ist, und wenn die googleApiClient-Aufgabe abgeschlossen ist oder granted falsch 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 die Erlaubnis auch alleine aufteilen und, wenn sie erteilt wird, den Taskaufruf ausführen. Ok, ich werde gestehen, dass ich ein Fragment verwende, und ich habe die App neu installiert, sogar den Bildschirm auf Berechtigungen gedreht, und sobald dies gewährt wurde, wurde das Ergebnis angezeigt. Ich hoffe das hilft anderen Menschen.

  • Sie müssen die App nicht deinstallieren. Gehen Sie einfach zu Einstellungen/Anwendungsmanager/Ihre App/Berechtigungen und schalten Sie alle aus. Testen Sie dann die App erneut.
0
Juan Mendez

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

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

Die Implementierung des GoogleApiClient ist anscheinend nur für eine einzelne Instanz vorgesehen. Es ist am besten, sie nur einmal in onCreate zu instanziieren und dann Verbindungen und Trennungen mit der einzelnen Instanz durchzuführen.

0
Naveen Kumar M

rufen Sie die connect () -Methode in der onStart () -Methode 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();
       }
0
user6250541