2015-05-22 3 views
11

Es ist ein bekanntes Problem, dass viele Android-Handys den Beschleunigungsmesser ausschalten, wenn die screen goes off. Etwas scheint sich jedoch mit Android Fit (der App) geändert zu haben. Fit zählt die Schritte auch dann fort, wenn der Bildschirm ausgeschaltet wird. Wenn Fit installiert ist, dann werden die Ereignisse für Schritt angehoben innerhalb der Fit-Umgebung zu zählen, und ich bin in der Lage, sie zu erfassen mitSchrittzähler in Android: immer an?

Fitness.SensorsApi.findDataSources(mClient, new DataSourcesRequest.Builder() 
       .setDataTypes(DataType.TYPE_STEP_COUNT_CUMULATIVE) 

ich dies auf einem Samsung S4 getestet haben und auf einem OnePlus One und in beiden Fällen die Schritte werden gezählt. Wie machen sie das? Welche Android-Klassen verwenden sie? Mein Verständnis ist, dass die seit Kitkat verfügbare Methode die Implementierung eines SensorEventListeners ist. Zum Beispiel stellt theelfismike den Code implements this zur Verfügung. Bei vielen Telefonen hört die Schrittzählung jedoch auf, wenn der Bildschirm ausgeschaltet wird. Interessanterweise scheint die Zählung nicht zu stoppen, wenn die Google Fit App installiert ist (daher nehme ich an, dass sie den Beschleunigungsmesser aktiviert lassen).

Fehle ich etwas? Ist es den sterblichen Programmierern möglich, Zählschritte nach dem Ausschalten des Bildschirms zu behalten? Danke!

Antwort

7

Wie Ilja sagte, läuft Ihr Code auch nach dem Ausschalten des Bildschirms. Aber in diesem Fall brauchen wir eine etwas andere Antwort.

Sie verwenden definitiv einen Service, der eine wakelock hält und sie die Sensoren nach Daten abfragen. Ein wichtiger Teil ist das Halten des Wakelocks - Sie müssen verhindern, dass das Gerät während der Laufzeit Ihres Dienstes in den Ruhezustand geht - wenn Sie keine Daten verpassen wollen.

Aber dieser Ansatz wird die Batterie wirklich schnell entladen, denn um Schritte zu erkennen, müssen Sie ziemlich viele Daten von Sensoren verarbeiten.

Deshalb gibt es sensor batching. So können Sie kontinuierlich Sensordaten erhalten, ohne das Gerät wach zu halten. Im Grunde speichert es die Sensorereignisse in einer hw-basierten Warteschlange direkt im Chip selbst und sendet sie nur in vordefinierten Abständen in Chargen an Ihre App (Dienst, ..). So können Sie rund um die Uhr überwachen, ohne die Batterie erheblich zu entladen. Bitte beachten Sie, dass dies nur von unterstützten Chipsätzen unterstützt wird (Details finden Sie in Android-Dokumenten), bei älteren Telefonen müssen Sie auf die scheußliche Wakelock-Aufbewahrungsmethode zurückgreifen, um Ihre Daten zu erhalten.

Sie können auch Google Fit APIs benutzen Sie einfach, aber dies würde nur funktionieren, wenn beide Google Fit + Google-Services sind auf dem Gerät installiert Spielen mit der Überwachung eingeschaltet.

+0

Danke @simekadam. Was Sie sagen, ist richtig. Was ich jedoch nicht verstehe ist, wie sie es machen. Die einzige Art, wie ich den Schrittzähler auf vielen Telefonen laufen lassen kann, ist eine vollständige Sperre, die nicht wirklich energieeffizient ist. Die Teilwakelocks wie WakefulBroadcastReceiver scheinen von den meisten Beschleunigungsmessern ignoriert zu werden. Deshalb frage ich mich, wie sie das effizient machen. – FabioC

+0

@FabioCiravegna könnten Sie bitte mehr Code zu Ihrer Frage posten? Das könnte mir helfen, dein Problem zu lösen. Du startest deinen Stepcounter von einem WakefulBroadcastReceiver?Starten Sie Ihren Aufzeichnungsdienst mit startWakefulService? Erwerben Sie dann auch einen separaten Wakelock für Ihren Service? (WakeFullBroadcastReceiver gibt seine WakeLock nach 60 Sekunden) – simekadam

+0

vielen Dank für das Angebot zu helfen. Ich habe ein einfaches Beispiel auf [link] (https://github.com/fabcira/step_counter_with_wakeLock) Github erstellt. Es ist noch einfacher als der, den ich vorher erwähnt habe. Die Hauptaktivität registriert den Sensor und richtet einen Teil-Wakelock ein. Dann beginne ich die Aktivität. Der step_counter funktioniert. Wenn ich das Telefon ausschalte, hört es auf. Ich habe jedoch einen Dienst erstellt, der prüft, ob der wakeLock eingeschaltet ist. Es ist. Aber der Schrittzähler ist ausgeschaltet. Die Einrichtung prüft auch, ob das Telefon über den Hardware-Schrittzähler verfügt. Meine hat es. Ich bin verwirrt. Jede Hilfe ist willkommen. Vielen Dank! – FabioC

0

Jedes normales Thema ist auf der Arbeit zu halten, wenn der Bildschirm oder erlischt, wenn die Aktivität verlor seinen Fokus ... aber wenn die Aktivität getötet wird dann alle Thread getötet ...

auch immer Sie für Dienste verwenden können langlaufende Aufgaben wie die Frage nach dem Beschleunigungssensor zum Beispiel

+0

Danke für Ihre Antwort. Ich benutze Hintergrunddienste und wenn die App den Fokus verliert, arbeiten sie immer noch. Ich benutze dabei sowohl den Schrittzähler als auch die Aktivitätserkennung. Die Aktivitätserkennung läuft weiter. Der Schrittzähler wird getötet. – FabioC

Verwandte Themen