7

Nella nostra app abbiamo usato il Fused Location Provider (FLP) per tracciare la posizione. Abbiamo notato che occasionalmente l'app può entrare in uno stato in cui il callback della posizione non viene più chiamato. L'app in questione viene utilizzata principalmente su due tablet (un Nexus 7 e LG G-pad 8.3). Abbiamo visto che il problema si verifica su entrambi i dispositivi. In generale, il ripristino del dispositivo sembra alleviare il problema. Crediamo di seguire la maggior parte delle migliori pratiche per l'utilizzo del FLP. Ma nel caso in cui mettiamo insieme questo codice di esempio che illustra come utilizziamo il FLP.Fuse Location Provider - onLocationChanged smette di chiamarsi

Prendi un client API di Google e chiamare connettersi:

m_googleApiClient = builder 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
m_googleApiClient.connect() 

Una volta collegati iniziamo ad ascoltare per le richiamate posizione:

@Override 
public void onConnected(Bundle bundle) { 
    m_fusedLocationProviderApi.requestLocationUpdates(m_googleApiClient, m_locationRequest, this); 
} 

la richiesta di posizione è simile al seguente:

LocationRequest locationRequest = LocationRequest.create(); 
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    locationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS); 
    locationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS); 

Quindi implementiamo la richiamata in questo modo:

@Override 
public void onLocationChanged(Location location) { 
    // set location member var and record timestamp. 
} 

Quando si verificano i problemi, non sembra che si ottengano richiami di errore. Abbiamo provato a chiamare reset() sul client API di Google quando rileviamo che non abbiamo ricevuto un GPS da molto tempo. Monitoriamo anche la disponibilità della posizione utilizzando un timer ogni 2 secondi (utilizzando getLocationAvailability). In genere, rileviamo che il ripristino del dispositivo da parte dell'utente (accensione, spegnimento) risolve il problema.

Le nostre domande sono:

  1. chiunque altro ha notato questo problema con la FLP?
  2. C'è altro che possiamo fare per risolvere il problema a meno che l'utente non sia resettato? Rimuovere rimuovere l'aggiunta di aggiornamenti di posizione aiuto?
  3. C'è più informazioni che possiamo/dovremmo raccogliere per diagnosticare il problema?
+0

Sto avendo lo stesso problema esatto. Quale versione di Google Play Services stai utilizzando e quali versioni del sistema operativo disponi sui dispositivi poiché mi chiedo se ciò faccia la differenza? –

+0

Recentemente ho iniziato a usare 9.2.1 e non ho ancora visto il problema (incrociamo le dita). – noahd

+1

Ho ricevuto esattamente lo stesso problema di recente. Hai visto questo problema da quando aggiorna la tua versione del servizio Google Play. Grazie. –

risposta

3

Ho lavorato con FusedLocationProvider estesamente su un ampio spettro di dispositivi, entrambe le questioni simili fascia bassa & di fascia alta e hanno visto in cui i dati GPS avuto brutte patch in mezzo. Per questo motivo, ho apportato alcune modifiche a questi problemi relativi all'affidabilità & robustezza (come elencato di seguito) e non ho visto questi problemi dopo.

Nella mia esperienza, le possibili soluzioni a tali problemi sono:

  1. Aggiornamento Play Services: stavo usando Android versioni Play Services nella gamma di 7.x - 8.x quando Ho avuto questi problemi.

    Sol: Nel recente passato, l'aggiornamento a 10.x versioni di servizi di gioco hanno aiutato a risolvere i problemi. Non abbiamo visto questi problemi pubblicare l'aggiornamento, quindi questo potrebbe sicuramente essere uno dei motivi anche nel tuo caso.

  2. Rendere Servizio Android più affidabile & robusto: Questo è uno dei motivi principali che abbiamo visto blackout nei dati GPS e durante il riavvio del dispositivo o l'inizializzazione di nuovo l'installazione, in genere riavviare il servizio. E quindi, il riavvio del servizio potrebbe riprendere gli aggiornamenti di posizione alla normalità.

    Sol: ho utilizzare un servizio di primo piano, invece di servizio in background e questo è di gran lunga la soluzione più affidabile qui, ma questo viene fornito con una notifica interfaccia utente appiccicoso per l'utente. Se non lo fa, anche il mantenimento dello stato di salute (in esecuzione o ucciso) per il servizio in background può essere una buona opzione.

  3. riconnessione GoogleAPIClient sulla sospensione connessione/errore Ho visto situazioni in cui la connessione GoogleAPIClient è sospesa o restituisce un errore a causa delle condizioni di rete errate o per altri motivi. Sebbene non sia stato in grado di convalidare un impatto diretto di questo sulla perdita di dati sulla posizione, questo potrebbe benissimo essere un motivo in questo caso. A supporto di ciò, il ripristino degli aggiornamenti di posizione avrà esito negativo nel caso in cui si verifichi questo problema di connessione a GoogleAPIClient e questo è ciò che è stato osservato anche da te.

    Sol: Un semplice riconnessione di GoogleAPIClient sulla sospensione o errore può risolvere questo.

Oltre a questi, v'è un motivo in più che potrebbe essere responsabile di questo problema:

dispositivo GPS fix perse: Ci sono momenti in cui il dispositivo perde la sua posizione GPS causando l'assenza di dati GPS fino al momento in cui è possibile ripristinare la correzione GPS. Non è assolutamente possibile determinare se la posizione è stata persa a causa di una correzione GPS. Il ripristino delle impostazioni di localizzazione del dispositivo ha un impatto sul dispositivo che sta tentando una correzione GPS, che potrebbe essere il motivo anche qui.

NEGAZIONE: Sono uno sviluppatore Android @HyperTrack e stiamo sviluppando una pila posizione per gli sviluppatori che stanno costruendo funzioni di localizzazione nelle loro applicazioni e questi sono il tipo di problemi che abbiamo solving. Sarebbe bello per te testare scenari simili usando il nostro SDKs e nel caso in cui tu vedessi ancora il problema saremmo lieti di aiutarti a raggiungere la sua causa principale ea risolvere il problema.

+0

Apprezzo la risposta dettagliata! – noahd

-2

Si può provare a controllare LocationSettings in questo modo:

request = LocationRequest.create(); 
    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(request); 
    builder.setAlwaysShow(true); 
    PendingResult<LocationSettingsResult> result = 
      LocationServices.SettingsApi.checkLocationSettings(apiClient, builder.build()); 
    result.setResultCallback(new ResultCallback<LocationSettingsResult>() { 
     @Override 
     public void onResult(@NonNull LocationSettingsResult result) { 
      final Status status = result.getStatus(); 
      switch (status.getStatusCode()) { 
       case LocationSettingsStatusCodes.SUCCESS: 
        LocationServices.FusedLocationApi.requestLocationUpdates(apiClient, request, locationListener); 
        break; 
       case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 
        try { 
         status.startResolutionForResult(context, REQUEST_CODE); 
        } catch (IntentSender.SendIntentException e) {} 
        break; 
       case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
        break; 
      } 
     } 
    }); 

quindi gestire le impostazioni di richiedere servizio onActivityResult

switch (requestCode) { 
    case REQUEST_CODE: 
     switch (resultCode) { 
     case Activity.RESULT_OK: 
     // All required changes were successfully made 
     LocationServices.FusedLocationApi.requestLocationUpdates(apiClient, request, locationListener); 
     break; 
     case Activity.RESULT_CANCELED: 
     // The user was asked to change settings, but chose not to 
     break; 
     default: 
     break; 
     } 
    break; 
} 

Se non aiuta, tenta di declassare google-play-servizi versione.

+0

Sì, sono a conoscenza di questo controllo delle impostazioni. Non penso che ci sia un problema con le impostazioni ... In realtà ottengo il callback per la maggior parte del tempo. Il problema è che a volte entriamo in uno stato in cui la callback smette di funzionare e il dispositivo deve essere resettato per ricominciare a farlo. – noahd

Problemi correlati