This example uses either TYPE_STEP_DETECTOR
or TYPE_ACCELEROMETER
sensors to detect a step trigger. In my own case, I don't use TYPE_STEP_COUNTER
, because there are some Xiaomi devices, where this sensor isn't triggered immediately. If you want to continuously receive a steps trigger on as many devices as possible, TYPE_STEP_COUNTER
isn't recommended. Also, there are some devices that don't have TYPE_STEP_DETECTOR
or it's unavailable. Therefore, there is a replacement solution that uses TYPE_ACCELEROMETER
. It will self-calculate steps using Sensor Fusion Math. Feel free to check more in this repository simple-pedometer
- You could choose which sensor you would like to use in your case.
private fun buildStepDetector() {
val accelSensorDetector = AccelSensorDetector(this@MainActivity)
val stepSensorDetector = StepSenorDetector(this@MainActivity)
val availableAccel = accelSensorDetector.registerListener(object : StepListener {
override fun onStep(count: Int) {
accelSteps += count
viewBinding?.textAccelSensor?.text =
getString(R.string.text_steps_using_accel_sensor, accelSteps)
}
})
val availableStepDetector = stepSensorDetector.registerListener(object : StepListener {
override fun onStep(count: Int) {
stepDetectorSteps += count
viewBinding?.textStepSenor?.text =
getString(R.string.text_steps_using_step_detector_sensor, stepDetectorSteps)
}
})
var error = ""
if (!availableAccel) {
error += getText(R.string.text_error_unavailable_accel_sensor)
}
if (!availableStepDetector) {
if (error.isNotEmpty()) {
error += "\n\n"
}
error += getText(R.string.text_error_unavailable_step_detector_sensor)
}
viewBinding?.textError?.text = error
}
- Or you could use
StepDetectorFactory.create(Context)
. It will check TYPE_STEP_DETECTOR first, if it's unavailable, it will check to TYPE_ACCELEROMETER. Both sensors are unavailable,stepDetector.registerListener(StepListener)
will returnfalse
private fun buildStepDetector() {
val stepDetector = StepDetectorFactory.create(this)
val isAvailable = stepDetector.registerListener(object : StepListener {
override fun onStep(count: Int) {
accelSteps += count
viewBinding?.textAccelSensor?.text = getString(R.string.text_steps, accelSteps)
}
})
if (!isAvailable) {
viewBinding?.textError?.text = getText(R.string.text_error_unavailable_sensor)
}
}
You can check demo APK here
If you find my assistance helpful, feel free to support me by buying me a coffee or following me on GitHub. Thank you!!!