66

Quindi ho trovato qualcosa che non è molto chiaro per me su GoogleApiClient. GoogleApiClient ha una funzione chiamata onConnected che è scappato quando il cliente è contatto (di sicuro)GoogleApiClient sta lanciando "GoogleApiClient non è ancora connesso" DOPO che la funzione onConnected si chiama

ho avuto il mio funzione chiamata: startLocationListening che è alla fine sempre invitato la funzione di GoogleApiClient onConnected .

Quindi la mia funzione startLocationListening non poteva essere eseguita senza una connessione GoogleApiClient.

Codice e log:

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

L'eccezione è:

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) 

...

Il mio registro di debug dice anche la funzione onConnected stato chiamato:

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 

Dopo questo ho ottenuto l'eccezione.

Mi manca qualcosa qui? Ho ricevuto una risposta per "connesso" Ho eseguito la mia funzione, e ho ricevuto l'errore "non connesso" che cosa è questo? Inoltre una cosa fastidiosa è: ho usato questo servizio di localizzazione per settimane e non ho mai ricevuto questo errore.

EDIT:

ho aggiunto un output di registro più specifica, appena soffiato la mia mente, check this out:

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

log in questo caso:

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. 

Sì , ho appena ottenuto mGoogleApiClient.isConnected() == false all'interno di onConnected() come è possibile?

E D I T:

Dal momento che nessuno poteva rispondere a questa, anche con la reputazione di taglie, ho deciso di segnalare questo come un bug di Google. Quello che è seguito è stato davvero sorpreso da me. risposta ufficiale di Google per la mia relazione:

"Questo sito web è per le questioni di sviluppo con il codice AOSP Android fonte e il set di strumenti di sviluppo, e non applicazioni di Google o servizi quali Play Services, GMS o API di Google Purtroppo. non sembra che sia un luogo appropriato per segnalare bug con Play Services.Tutto quello che posso dire che questo sito non è, mi dispiace. Prova a pubblicare post sui forum dei prodotti Google . "

problema completa report here. (spero si suole rimuoverlo solo perché la sua stupida)

Quindi sì ho preso uno sguardo al Forum dei prodotti Google e proprio chef era estremamente trovare qualsiasi argomento per pubblicare questa cosa, così, alla momento Iam perplesso e bloccato

Vuol anyobody nel pianeta terra potrebbe aiutarmi con questo

EDIT:.?

codice completo nella pastebin

+0

Potrebbe aggiungere un po 'di registrazione a onConnectionSuspended(), così per vedere se questo è chiamato in qualsiasi momento? –

+0

@AntiVeeranna Ho ottenuto anche la registrazione su onConnectionSuspended() a quella funzione mai chiamata. –

+0

Puoi anche pubblicare il codice che crea mGoogleApiClient? –

risposta

72

Ho appena notato che si sta creando il googleApiClient in onStartCommand(). Questa sembra una cattiva idea.

Diciamo che il servizio viene attivato due volte. Verranno creati due oggetti googleApiClient, ma avrai solo un riferimento a uno. Se colui il cui riferimento non ha eseguito il callback su onConnected(), si sarà connessi in quel client ma il client di cui si ha effettivamente il riferimento potrebbe ancora essere disconnesso.

Sospetto che sia quello che sta succedendo. Prova a spostare la tua creazione googleApiClient su onCreate e controlla se ottieni lo stesso comportamento.

+0

Yup , Penso che tu abbia capito bene! http://developer.android.com/reference/android/app/Service.html#ServiceLifecycle – EyesClear

+0

Ciao @iheanyi. Sto creando il mio oggetto "googleApiClient" sul metodo onCreate() del mio MainActivity. Ma ottengo questo errore su alcuni dispositivi. Cosa puoi dire di questo? –

+0

@SattarHummatli È difficile da dire. La situazione in questa domanda non è probabilmente l'unico modo in cui qualcuno può finire con questo errore. Prima verificherei che non avessi una condizione di competizione simile: ad esempio, assicurati di creare googleApiClient in un unico punto. Se hai ancora un problema, prova a mettere insieme [esempio di codice completo e verificabile minimo] (http://stackoverflow.com/help/mcve) e posta una domanda. Quindi rispondi con un commento a me con un link e darò un'occhiata. – iheanyi

2

ho avuto lo stesso errore, ma il mio problema era diverso dalla risposta di iheanyl:

avevo dichiarato il googleApiClient statica. Questo ha impedito ad Android di chiudere il servizio.

-4

spostare la creazione di googleApi su onCreate ha risolto il problema per me.

+8

La ripetizione della risposta accettata non è utile a nessuno, basta creare rumore –

-1

Ho avuto questo problema quando accidentalmente ma googleApiClient.connect() in oncreate e onresume. L'ho appena rimosso da oncreate.

0

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

Si dovrebbe istanziare un oggetto client nel metodo di attività onCreate (Bundle) e quindi chiamare connect() in onStart() e disconnessione() in onStop(), indipendentemente dallo stato.

L'implementazione di GoogleApiClient è progettata per una sola istanza. È meglio istanziarlo una sola volta su onCreate, quindi eseguire connessioni e disconnessioni usando la singola istanza.

0

chiamata collegare metodo() in onStart() metodo

@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

Credo di avere trovato la radice del problema e non ha nulla a che fare con l'API. Ho affrontato questo problema ogni volta che installo l'app. Ad ogni modo, proprio come il commento più popolare ho solo un googleApiClient in pausa e riprendere. Quello che ho notato è che viene visualizzata la richiesta di autorizzazione per ottenere l'accesso alla geolocalizzazione. Come sapete nella vostra attività questo si trasformerà in una pausa, e una volta che il popup sarà scomparso riprenderà la vostra attività. Molto probabilmente il tuo googleClient è anche incatenato a quegli eventi per disconnetterti e connettersi.Puoi dire che non vi è alcuna connessione una volta che l'autorizzazione è stata accettata e stai per eseguire l'attività 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 
        } 
       }); 
    } 

È possibile saltare lo scollegamento e il collegamento ed impostare una bandiera che è vero prima di permesso e una volta che il compito è completato o googleApiClient granted è falso.

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

Possiamo anche dividere il permesso di fare da solo e, se concesso, effettuare la chiamata di attività. Ok, ho intenzione di confessare che sto usando un frammento, e ho reinstallato l'app anche ruotato lo schermo sulle autorizzazioni e una volta concesso, il risultato è arrivato. Spero che questo aiuti le altre persone.

  • Non è necessario disinstallare l'app. Basta andare su impostazione/gestore applicazioni/app/permessi e disattivarne uno, quindi testare nuovamente l'app.
0

Ho avuto questo problema da e ho risolto con dichiarando googleApiClient come oggetto statico

Problemi correlati