7

In unserer App verwendeten wir den Fused Location Provider (FLP), um den Standort zu verfolgen. Wir haben festgestellt, dass die App gelegentlich in einen Zustand versetzt werden kann, in dem der Standort-Callback nicht mehr aufgerufen wird. Die betreffende App wird hauptsächlich auf zwei Tablets verwendet (Nexus 7 und LG G-Pad 8.3). Wir haben festgestellt, dass das Problem auf beiden Geräten auftritt. Im Allgemeinen scheint das Zurücksetzen des Geräts das Problem zu beheben. Wir glauben, dass wir den meisten Best Practices für die Verwendung des FLP folgen. Aber nur für den Fall, dass wir diesen Beispielcode zusammenstellen, der zeigt, wie wir das FLP verwenden.Fused Location Provider - onLocationChanged hört auf, sich anzurufen

Holen Sie sich ein Google-API-Client und rufen Sie an:

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

Sobald wir beginnen verbunden Standort Rückrufe hören:

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

Die Lage Anfrage wie folgt aussieht:

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

Wir implementieren dann den Rückruf wie folgt:

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

Wenn die Probleme auftreten, scheinen keine Fehlerrückrufe zu erhalten. Wir haben auch versucht, reset() auf dem Google API-Client aufzurufen, wenn wir feststellen, dass wir seit langem kein GPS mehr erhalten haben. Wir überwachen auch die Verfügbarkeit des Standorts mithilfe eines Timers alle 2 Sekunden (mit getLocationAvailability). In der Regel stellen wir fest, dass das Problem durch das Zurücksetzen des Geräts durch den Benutzer (Einschalten, Ausschalten) behoben wird.

Unsere Fragen sind:

  1. Hat jemand anderes dieses Problem mit FLP bemerkt?
  2. Gibt es mehr, was wir tun können, um das Problem zu beheben, dass der Benutzer zurückgesetzt wird? Möchten Sie die Hilfe zum Hinzufügen von Standortaktualisierungen entfernen?
  3. Gibt es mehr Informationen, die wir sammeln können/sollten, um das Problem zu diagnostizieren?
+0

Ich habe das gleiche genaue Problem. Welche Version von Google Play Services verwenden Sie und welche Betriebssystemversionen haben Sie auf den Geräten? Ich frage mich, ob das einen Unterschied macht? –

+0

Ich habe kürzlich mit 9.2 begonnen.1 und habe das Problem noch nicht gesehen (Daumen gedrückt). – noahd

+1

Ich habe kürzlich genau das gleiche Problem bekommen. Haben Sie dieses Problem seit dem Upgrade Ihrer Google Play Service-Version gesehen? Vielen Dank. –

Antwort

3

Ich habe mit FusedLocationProvider ausführlich über ein breites Spektrum von Geräten, Low-End-& High-End und gesehen haben ähnliche Probleme, wo die GPS-Daten hatten schlechtes Patches zwischen gearbeitet. Aus diesem Grund habe ich ein paar Änderungen vorgenommen, um diese Probleme im Zusammenhang mit Zuverlässigkeit & Robustheit (wie unten aufgeführt) und haben diese Probleme nicht danach gesehen.

Nach meiner Erfahrung ist die möglichen Lösungen für solche Probleme sind:

  1. Aktualisierung Play-Dienste: Ich war mit Android Play-Dienste-Versionen im Bereich von 7.x - 8.x, wenn Ich hatte diese Probleme.

    Sol: In der jüngsten Vergangenheit zu 10.x-Versionen von Play-Diensten zu aktualisieren haben bei der Lösung der Probleme geholfen. Wir haben diese Probleme nach dem Update nicht mehr gesehen, also könnte dies definitiv einer der Gründe in Ihrem Fall sein.

  2. macht Android-Service zuverlässige & robust: Dies ist einer der wichtigsten Gründe, warum wir Stromausfälle in GPS-Daten gesehen und während das Gerät neu zu starten oder das Setup erneut initialisiert wird, wir starten im Allgemeinen den Dienst. Daher kann der Dienst, der wieder gestartet wird, die Standortaktualisierungen auf normal fortsetzen.

    Sol: Ich benutze einen Vordergrund Dienst statt Hintergrunddienst und dies ist bei weitem der zuverlässigste Lösung hier, aber das kommt mit einer klebrigen UI-Benachrichtigung für den Benutzer. Wenn dies nicht der Fall ist, dann kann es auch eine gute Option sein, einen Gesundheitscheck für den Hintergrunddienst zu führen.

  3. Reconnect GoogleAPIClient auf Verbindungs ​​Suspension/Fehler Ich habe Situationen erlebt, in denen die GoogleAPIClient Verbindung unterbrochen ist oder einen Fehler zurück wegen der schlechten Netzwerkbedingungen oder aus anderen Gründen. Obwohl ich eine direkte Auswirkung davon auf den Verlust von Standortdaten nicht bestätigen konnte, könnte dies in diesem Fall durchaus ein Grund sein. Um dies zu unterstützen, schlägt das Zurücksetzen von Standortaktualisierungen fehl, falls dieses Verbindungsproblem mit GoogleAPIClient auftritt und dies auch von Ihnen beobachtet wurde.

    Sol: Eine einfache Wiederverbindung von GoogleAPIClient auf Aussetzung oder Fehler kann dieses Problem zu beheben.

Abgesehen von diesen gibt es einen weiteren Grund, der für dieses Problem verantwortlich sein könnte:

Gerät GPS verloren fix: Es gibt Zeiten, wenn das Gerät verliert seine GPS-Fix Dies führt zu fehlenden GPS-Daten bis zu dem Zeitpunkt, an dem die GPS-Daten wiederhergestellt werden können. Es gibt absolut keine Möglichkeit festzustellen, ob der Standort aufgrund eines GPS-Fixes verloren gegangen ist. Das Zurücksetzen der Standorteinstellungen des Geräts hat Auswirkungen darauf, dass das Gerät versucht, GPS zu reparieren, was möglicherweise auch der Grund dafür sein könnte.

HAFTUNGSAUSSCHLUSS: Ich bin ein Android Developer @HyperTrack und wir einen Standort-Stack für Entwickler sind zu entwickeln, die Standortfunktionen in ihren Anwendungen bauen und dies sind die Art von Problemen, die wir zu lösen haben. Es wäre großartig für Sie, ähnliche Szenarien mit unserer SDKs zu testen. Falls Sie das Problem weiterhin sehen, helfen wir Ihnen gerne bei der Lösung der Ursache und beheben das Problem.

+0

Ich schätze die detaillierte Antwort! – noahd

-2

Sie können versuchen, LocationSettings wie dies zu überprüfen:

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

dann Einstellungen behandeln anfordern in 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; 
} 

Wenn es nicht hilft, versuchen Sie Google-Play-Dienste degradieren Ausführung.

+0

Ja, ich kenne diese Einstellungsprüfung. Ich glaube nicht, dass es ein Problem mit den Einstellungen gibt ... Ich bekomme die meiste Zeit den Rückruf. Das Problem ist, dass wir manchmal in einen Zustand geraten, in dem der Rückruf nicht mehr stattfindet. Das Gerät muss zurückgesetzt werden, um es wieder zu bekommen. – noahd