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() == false
reingekommen, 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
Antworten:
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.
quelle
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.
quelle
Ich hatte dieses Problem und habe es gelöst, indem ich googleApiClient als statisches Objekt deklariert habe
quelle
https://developer.android.com/reference/com/google/android/gms/common/api/GoogleApiClient.html
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.
quelle
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
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
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 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.
quelle
Durch das Verschieben von GoogleApiClient von onStartCommand nach onCeate wurde mein Problem behoben
quelle
Ich hatte dieses Problem, als ich versehentlich aber googleApiClient.connect () in oncreate und onresume. Einfach von oncreate entfernt.
quelle
Durch das Verschieben der googleApi-Erstellung nach onCreate wurde das Problem für mich behoben.
quelle