Mein ZielFirebase onComplete nie im Hintergrund Prozess namens
eine App zu entwickeln, die Benutzer-Ortung auf & auszuschalten ermöglicht. Wenn das Tracking aktiviert ist, möchte ich die Standortdaten des Benutzers an Firebase senden.
Meine versuchte Lösung
Ich benutze PendingIntent und die Google-Dienste FusedLocationAPI Spielen Lage im Hintergrund zu verfolgen. Bei jeder Standortaktualisierung (unterbrochen von 30 Sekunden) löst der PendingIntent eine Absicht (mit einer Standortaktualisierung, falls verfügbar) auf einen WakefulBroadcastReceiver aus. Der WakefulBroadcastReceiver sollte dann die Standortdaten in Firebase speichern.
Hier ist, was die WakefulBroadcastReceiver wie folgt aussehen: (! Auf einigen Geräten)
public class LocationProcessingReceiver extends WakefulBroadcastReceiver {
private static final String TAG = "LocationProcessingRcv";
@Override
public void onReceive(Context context, Intent intent) {
if (LocationResult.hasResult(intent)) {
Log.i(this.TAG, "Received location result");
// Extract location from result and push to server
Location location = LocationResult.extractResult(intent).getLastLocation();
this.pushLocationToServer(location, intent.getStringExtra("userId"));
}
else {
Log.i(TAG, "No location result");
}
}
/**
* Pushes location to Firebase server
* @param location
*/
private void pushLocationToServer(Location location, String userId) {
FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
// Data to update the latest status of the user
Map<String, Object> statusMap = new HashMap<String, Object>();
// ... various statusMap.put(...) calls go here
// Get reference to Firebase as well as key at which to update reference
DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference();
dbRef.child(DB_LOC_HISTORY_REFERENCE).push().updateChildren(historyMap, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
if (databaseError == null) {
Log.i(TAG, "Successfully pushed to server");
}
else {
Log.i(TAG, "Server push failed: " + databaseError.toString());
}
}
});
}
}
Das Problem
Bei einigen Telefonen wird der onComplete Rückruf nie genannt. Ich habe keine Ahnung, warum das nicht funktioniert ... Auf einigen Geräten funktioniert der Rückruf wie erwartet. Bei anderen wird der Rückruf nie empfangen und ich sehe die Daten nie in Firebase aktualisiert.
Die Protokolle zeigen, dass die Standortaktualisierungen einwandfrei funktionieren und dass die onReceive() - Methode des WakefulBroadcastReceivers wie erwartet regelmäßig aufgerufen wird.
Ich hätte erwartet onComplete, aber um einen Fehler anzuzeigen, wenn ein Verbindungsproblem vorliegt. Aber das passiert nie, und ich kämpfe darum, warum.
Ein Vorbehalt: Viele dieser Geräte laufen auf 3G. Ist es möglich, dass, wenn meine App im Hintergrund ist, der BroadcastReceiver beendet wird, bevor Firebase das erledigt, vielleicht weil die 3G-Verbindung zu langsam ist?
Haben Sie jemals eine Lösung gefunden? – andygeers