2015-05-22 2 views
11

Известно, что многие телефоны Android выключили акселерометр, когда screen goes off. Однако, похоже, что-то изменилось с Android Fit (приложение). Fit продолжает отсчет шагов, даже когда экран гаснет. Если Fit установлен, то события возникают на этапе подсчета в Fit среды и я могу захватить их с помощьюСчетчик шагов в Android: всегда включен?

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

Я испытал это на Samsung S4 и на OnePlus One и в обоих случаях шаги считаются. Как они это делают? Какие классы Android они используют? Я понимаю, что доступный метод, введенный с момента создания Kitkat, заключается в реализации SensorEventListener. Например, theelfismike предоставляет код, который implements this. Однако на многих телефонах счетчик шагов останавливается, когда экран выключается. Интересно, что подсчет не прекращается, если установлено приложение Google Fit (поэтому я думаю, что они поддерживают акселерометр).

Я что-то упустил? Является ли функциональность отслеживания шагов подсчета после экрана доступными для смертных программистов? Спасибо!

ответ

7

Как сказал Илья, ваш код работает даже после того, как экран отключается. Но в этом случае я думаю, нам нужен немного другой ответ.

Они определенно используют Сервис, который хранит wakelock, и они запрашивают датчики для данных. Важная часть здесь заключается в том, что вы держите wakelock - вы должны препятствовать тому, чтобы устройство спалось во время вашей службы - если вы не хотите пропустить некоторые данные.

Но этот подход будет разряжать аккумулятор очень быстро, потому что для обнаружения шагов вам нужно обработать довольно много данных от датчиков.

Вот почему есть sensor batching. Это позволяет получать непрерывные данные датчика даже без пробуждения устройства. Он в основном хранит события датчиков в hw-based queue прямо в самом чипе и только отправляет их в ваше приложение (сервис, ..) с предопределенными интервалами в пакетах. Это позволяет проводить мониторинг 24/7 без значительного разряда батареи. Обратите внимание, что только поддерживаемые наборы микросхем могут это сделать (вы можете найти подробную информацию в документах Android), в случае старых телефонов вам необходимо вернуться к отвратительному методу хранения wakelock, чтобы получить ваши данные.

Вы также можете использовать Google Fit APIs, но это будет работать, только если на устройстве установлены Google Fit + Google Play Services с включенным мониторингом.

+0

Спасибо @simekadam. То, что вы говорите, правильно. Однако я не понимаю, как они это делают. Единственный способ, с помощью которого я могу следить за шагом на многих телефонах, - это получить полную блокировку, которая не является энергоэффективной. Частичные wakelocks, такие как WakefulBroadcastReceiver, по-видимому, игнорируются большинством акселерометров. Вот почему мне интересно, как они делают это эффективно. – FabioC

+0

@FabioCiravegna не могли бы вы разместить больше кода на ваш вопрос? Это может помочь мне решить вашу проблему. Вы начинаете свой stepcounter из WakefulBroadcastReceiver?Вы начинаете свою службу записи с помощью startWakefulService? Вы приобретаете раздельный вакелон для своего обслуживания, а затем? (WakeFullBroadcastReceiver выпускает свой wakelock через 60 секунд) – simekadam

+0

большое спасибо за предложение помочь. Я создал простой пример в [link] (https://github.com/fabcira/step_counter_with_wakeLock) Github. Это даже проще, чем тот, о котором я упоминал ранее. Основная активность регистрирует датчик и устанавливает частичный валок. Затем я начинаю работу. Работает step_counter. Когда я выключаю телефон, он останавливается. Однако я создал службу, которая проверяет, включен ли wakeLock. Это. Но счетчик шагов выключен. Настройка также проверяет, есть ли у телефона счетчик аппаратного шага. У меня это есть. Я сбит с толку. Любая помощь приветствуется. Благодаря! – FabioC

0

Каждой нормальная Нить продолжает работать, когда экран гаснет или когда активность потеряла свое внимание ... но когда активность убивает, то все нити убивают ...

Однако вы можете использовать услуги Долгосрочные задачи, например, запрос акселерометра, например

+0

Спасибо за ваш ответ. Я использую фоновые службы, поэтому, когда приложение теряет фокус, они все еще работают. Я использую как счетчик шагов, так и распознавание активности в этом процессе. Признание активности продолжается. Счетчик шагов убит. – FabioC

Смежные вопросы