2015-05-22 34 views
11

Jest to znany problem, że wiele telefonów z Androidem wyłącza akcelerometr, gdy screen goes off. Wygląda jednak na to, że coś się zmieniło w Androidzie Fit (aplikacja). Fit utrzymuje zliczanie kroków nawet po wyłączeniu ekranu. Jeśli jest zainstalowany Fit, wtedy zdarzenia są podniesione na etapie liczenia w Fit środowisku i jestem w stanie uchwycić je za pomocąLicznik kroków w Androidzie: zawsze włączony?

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

ja testowałem to na Samsung S4 i na OnePlus One i w obu przypadkach schodach są policzone. Jak oni to robią? Z jakich klas Android korzystają? Rozumiem, że dostępną metodą wprowadzoną od KitKat jest wdrożenie SensorEventListener. Na przykład thefelismike dostarcza kod, który jest implements this. Jednak w wielu telefonach liczenie kroków kończy się po wyłączeniu ekranu. Co ciekawe, liczenie nie kończy się, jeśli zainstalowana jest aplikacja Google Fit (dlatego domyślam się, że akcelerometr jest włączony).

Czy brakuje mi czegoś? Czy funkcja śmiertelnego programowania jest dostępna dla liczenia kroków po wyłączeniu ekranu? Dzięki!

Odpowiedz

7

Jak powiedział Ilja, twój kod działa nawet po wyłączeniu ekranu. Ale w tym przypadku potrzebujemy trochę innej odpowiedzi.

Zdecydowanie używają usługi, która przechowuje wakelock i wysyłają zapytania do czujników danych. Ważną częścią jest tutaj trzymanie wakelocka - musisz zapobiec spaniu urządzenia podczas życia usługi - jeśli nie chcesz przegapić niektórych danych.

Ale to podejście spowoduje szybkie wyczerpanie baterii, ponieważ aby wykryć kroki, trzeba przetworzyć dość dużo danych z czujników.

To dlatego istnieje sensor batching. To pozwala uzyskać ciągłe dane z czujników, nawet bez utrzymywania urządzenia w stanie czuwania. Zasadniczo przechowuje zdarzenia związane z czujnikami w kolejce opartej na hw bezpośrednio w samym chipie i wysyła je do aplikacji (usługa, ..) w określonych odstępach czasu w partiach. Pozwala to na monitorowanie 24/7 bez znaczącego rozładowania baterii. Pamiętaj, że tylko obsługiwane chipsety mogą to zrobić (możesz znaleźć szczegóły w dokumentach systemu Android), w przypadku starszych telefonów, aby odzyskać dane, musisz skorzystać z odrażającej metody przechowywania wakelocków.

Można również po prostu użyć Google Fit APIs, ale będzie to działać tylko wtedy, gdy na urządzeniu są zainstalowane usługi Google Fit + Google Play z włączonym monitoringiem.

+0

Dzięki @ simimadam. To, co mówisz, jest poprawne. Jednak nie rozumiem, jak to robią. Jedynym sposobem na utrzymanie licznika kroków w wielu telefonach jest uzyskanie pełnego zamka, który nie jest tak naprawdę energooszczędny. Częściowe wakeloki, takie jak WakefulBroadcastReceiver, wydają się być ignorowane przez większość akcelerometrów. Właśnie dlatego zastanawiam się, w jaki sposób robią to w skuteczny sposób. – FabioC

+0

@FabioCiravegna Czy mógłbyś dodać więcej kodu do swojego pytania? To może mi pomóc w rozwiązaniu Twojego problemu. Zaczynasz swój stepcounter od WakefulBroadcastReceiver?Czy rozpoczynasz swoją usługę nagrywania za pomocą startWakefulService? Czy zdobędziesz także oddzielny wakelok dla swojej usługi? (WakeFullBroadcastReceiver wypuszcza swój wakelock po 60 sekundach) – simekadam

+0

wielkie dzięki za pomoc. Stworzyłem prosty przykład na [link] (https://github.com/fabcira/step_counter_with_wakeLock) Github. Jest jeszcze prostsze niż ten, o którym wspominałem wcześniej. Główna aktywność rejestruje czujnik i ustawia częściową wakelock. Wtedy zaczynam aktywność. The step_counter działa. Kiedy wyłączam telefon, przestaje działać. Jednak stworzyłem usługę, która sprawdza, czy funkcja WakeLock jest włączona. To jest. Ale licznik kroków jest wyłączony. Konfiguracja sprawdza również, czy telefon ma licznik kroków sprzętowych. Mój to ma. Jestem zdziwiony. Każda pomoc jest mile widziana. Dzięki! – FabioC

0

Każdy normalny Temat jest utrzymać się na pracy, gdy ekran zgaśnie lub gdy aktywny stracił ostrość ... ale gdy aktywność ginie wtedy cały wątek ginie ...

Jednakże można użyć usługi Długie zadania, takie jak pytanie o akcelerometr, na przykład:

+0

Dzięki za odpowiedź. Używam usług w tle, więc gdy aplikacja traci koncentrację, nadal działają. Używam zarówno licznika kroków, jak i rozpoznawania aktywności w tym procesie. Rozpoznawanie aktywności trwa. Licznik kroków zostanie zabity. – FabioC