Michael H
Was mir auch noch nicht klar ist, von wo soll das Gerät wissen dass es jetzt z.B. 7m von der letzten Koordinate entfernt ist, ohne ständig Koordinaten zu sammeln?
Ah, Du verwechselst da etwas. Der LocationManager hat jederzeit Kenntnis wo er sich befindet - sofern die Subsysteme aktiviert sind. Du teilst mit requestLocationUpdates() lediglich mit das Du in den genannten Intervallen informiert werden möchtest.
Beispiel: Deine App und eine Navigations-App sind parallel aktiv. Es gibt nur einen LocationManager der seine Position permanent bestimmt. Dieser pflegt, einfach ausgedrückt, eine Liste der Apps die LocationUpdates "requested" haben. Ist irgendeiner der Intervalle der registrierten Apps abgelaufen dann wird der onLocationChanged() an diese App übermittelt - mehr nicht.
Michael H
Was ist aber wenn sich der Fahrer in einer Stadt befindet? Dann kann ein Kilometer oder eben 60sec ziemlich weit/lang sein, nicht?
Klar - wenn er nicht im Stau oder an der Ampel steht ;-) Dann zieht nämlich der Zeit-Intervall und nicht der Distanz-Intervall. Wie gesagt "whatever comes first". Die jeweilige Nutzungsart legt die Intervalle fest. Was soll die App denn machen? Diese Frage musst Du Dir stellen und basierend darauf die Intervalle intelligent setzen.
Ich registriere mich grundsätzlich für 2sec/7m <psst, nicht weiter erzählen>. Ich merke mir immer die letzte Location und aggregiere Entfernung und Zeit mit jedem LocationUpdate. Anschließend prüfe ich ob mit den Summen die vom Benutzer eingestellten Entfernungen oder Zeiten überschritten wurden. Ist das der Fall dann wird die Datenbank aktualisiert und die Summen werden für den nächsten Zyklus auf 0 gesetzt. Anschließend jage ich Broadcasts an interessierte Aktivities raus und gut ist (mein LocationManager Kram liegt immer in einem Service). Das hat Vor- und Nachteile: So ist die Karte während der Aufzeichnung immer aktuell. Wird die Karte später mal aus der Datenbank gezeichnet so hat sie nur die vom Benutzer eingestellten Genauigkeiten. Ich denke das ist ein guter Kompromiss.
Wie gesagt, Deine App ist nur ein kleiner Teil des Ganzen. Die Möglichkeiten der Akku Schonung sind, von den erwähnten Schnitzern mal abgesehen, marginal. Guck das Deine App möglichst schnell und ohne großes Brimborium aus dem onLocationChanged() rauskommt. Mehr kannst Du nicht machen ... und hoffen das Dein Benutzer nicht parallel Musik hört, eine Navi Software laufen lässt, und, und, und, ...
1private double intervallEntfernung;
2private long intervallZeit;
3private Location locationPrevious;
4private double summeEntfernung;
5
6@Override
7public void onLocationChanged(Location location) {
8
9 if (location != null && (locationPrevious == null || location.getLatitude() != locationPrevious.getLatitude() || location.getLongitude() != locationPrevious.getLongitude())) {
10 double entfernung = 0.0;
11 long zeitDiff = 0;
12
13 if (locationPrevious != null) {
14 entfernung = GeoTools.latLonDistance(locationPrevious.getLatitude(), locationPrevious.getLongitude(), location.getLatitude(), location.getLongitude());
15 zeitDiff = location.getTime() - locationPrevious.getTime();
16
17 intervallEntfernung += entfernung;
18 summeEntfernung += entfernung;
19
20 intervallZeit += zeitDiff;
21 summeZeit += zeitDiff;
22 }
23
24 if (intervallEntfernung > MyPreferenceActivity.getEntfernungsIntervall() || intervallZeit > (MyPreferenceActivity.getAufzeichnungsIntervall() * 1000)) {
25 // Neue Location in Datenbank eintragen, bisherige Summen updaten
26
27 intervallEntfernung = 0.0;
28 intervallZeit = 0;
29 }
30
31 Intent intent = new Intent();
32 intent.putExtra("LATITUDE", location.getLatitude());
33 intent.putExtra("LONGITUDE", location.getLongitude());
34 intent.putExtra("SPEED", location.getSpeed());
35 intent.putExtra("SUMMEENTFERNUNG", summeEntfernung);
36
37 intent.setAction(EineAktivitaet.MyBroadcastReceiver.TAG);
38 sendBroadcast(intent);
39
40 intent.setAction(EineAndereAktivitaet.MyBroadcastReceiver.TAG);
41 sendBroadcast(intent);
42
43 locationPrevious = location;
44 }
45}
— geändert am 03.07.2012, 12:22:47
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.