Sensor event listener not working in background service

2.7k Views Asked by At

I have created a step counter service to log step counts periodically using firebase job dispatcher. The sensor event is working when my app is running and logs the step count and it is not logging when the app is closed.

How to listen for a sensor event in background service?

class MyJobService : JobService(), SensorEventListener {

        val TAG = "MyJobService"

        var sensorManager: SensorManager? = null
        var stepsSensor: Sensor? = null

        override fun onStartJob(job: JobParameters): Boolean {

            sensorManager = applicationContext.getSystemService(Context.SENSOR_SERVICE) as SensorManager

            stepsSensor = sensorManager!!.getDefaultSensor(Sensor.TYPE_STEP_COUNTER)
            if (stepsSensor != null) {
                sensorManager!!.registerListener(this, stepsSensor, SensorManager.SENSOR_DELAY_FASTEST)
            } else {
                Log.e(TAG, "sensor not available")
            }

            return true // wait for sensor event
        }

        override fun onAccuracyChanged(theSensor: Sensor?, accuracy: Int) {

        }

        override fun onSensorChanged(event: SensorEvent?) {

            val latestSensorCount = event!!.values[0].toLong()
            Log.e(TAG, "Steps count $latestSensorCount") // works when App / activity is running

        }

        override fun onStopJob(job: JobParameters): Boolean {
            return false
        }

    }

Starting service from mainactivity from activity by

 val dispatcher = FirebaseJobDispatcher(GooglePlayDriver(this))
 val myJob = dispatcher.newJobBuilder()
            .setService(MyJobService::class.java)
            .setTag("my-jobservice-tag")
            .setRecurring(true)
            .setTrigger(Trigger.executionWindow(10,20))
            .setReplaceCurrent(true)
            .build()

 dispatcher.mustSchedule(myJob)
1

There are 1 best solutions below

3
Rajan Kumar On

If You're Testing this on Android Device with Android Pie

Please go through this Behavioral changes From Android Pie :

Sensors that use the continuous reporting mode, such as accelerometers and gyroscopes, don't receive events.

Android Pie Changes

Hope this Helps you