Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Step Counter in Android: always on?

It is a well known issue that many Android phones switch off the accelerometer when the screen goes off. However something seems to have changed with Android Fit (the app). Fit keeps counting steps even when the screen goes off. If Fit is installed, then events are raised for step counting within the Fit environment and I am able to capture them using

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

I have tested this on a Samsung S4 and on a Oneplus One and in both cases the steps are counted. How do they do that? What Android classes do they use? My understanding is that the available method introduced since Kitkat is to implement a SensorEventListener. For example theelfismike provides code that implements this. However on many phones the step counting stops when the screen goes off. Interestingly the counting does not seem to stop if the Google Fit app is installed (hence I guess they keep the accelerometer on).

Am I missing something? Is the functionality of keeping counting steps after screen off available to the mortal programmers? Thanks!

like image 966
FabioC Avatar asked May 22 '15 06:05

FabioC


1 Answers

As Ilja said, your code runs even after the screen gets turned off. But in this case I guess we need a little different answer.

They definitely use a Service that keeps a wakelock and they query the sensors for data. Important part here is holding the wakelock - you have to prevent the device from going into sleep during lifetime of your service - if you don't want to miss some data.

But this approach will be drain the battery really fast, because in order to detect steps you need to process quite a lot of data from sensors.

Thats why there is sensor batching. That allows you to get continuous sensor data even without keeping the device awake. It basically stores the sensor events in a hw based queue right in the chip itself and only sends them to your app (service,..) at predefined intervals in batches. This allows you to do a 24/7 monitoring without draining the battery significantly. Please note that only supported chipsets can do that (you can find details in Android docs), in case of older phones you need to fallback to the hideous wakelock keeping method in order to get your data.

You can also just use Google Fit APIs, but this would only work when there're both Google Fit + Google Play Services installed on the device with monitoring turned on.

like image 149
simekadam Avatar answered Oct 25 '22 01:10

simekadam