Android step counter传感器不从0开始计数,如何设置为从零开始计步?
Android TYPE_STEP_COUNTER传感器从0开始计数解决方案
核心原理
Android 系统的Sensor.TYPE_STEP_COUNTER默认返回设备上次重启以来的累计总步数,系统没有提供重置该数值的API,因此我们可以通过记录初始基准值、做差值计算的方式实现从0开始计数。
修改后完整代码
class MainActivity : AppCompatActivity() , SensorEventListener { private lateinit var sensorManager : SensorManager private lateinit var stepSensor : Sensor private lateinit var txt : TextView // 计步基准值,-1表示还未获取第一次传感器数据 private var initialStepCount = -1 // 可选:用于手动重置计步的偏移量 private var resetOffset = 0 override fun onCreate(savedInstanceState : Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager stepSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER) txt = findViewById(R.id.text1) // 可选:如果要加重置按钮,添加点击逻辑 // val resetBtn = findViewById<Button>(R.id.reset_btn) // resetBtn.setOnClickListener { // resetOffset = if (initialStepCount == -1) 0 // else (event?.values?.get(0)?.toInt() ?: 0) - initialStepCount // txt.text = "0" // } } override fun onResume() { super.onResume() // 注意:Android 10及以上需要先申请ACTIVITY_RECOGNITION权限再注册传感器 sensorManager.registerListener(this, stepSensor, SensorManager.SENSOR_DELAY_NORMAL) } override fun onSensorChanged(event : SensorEvent?) { event ?: return if (event.sensor.type != Sensor.TYPE_STEP_COUNTER) return val totalSystemSteps = event.values[0].toInt() // 第一次拿到传感器数据时记录初始基准 if (initialStepCount == -1) { initialStepCount = totalSystemSteps } // 计算用户可见的步数:系统总步数减初始基准减重置偏移 val currentUserSteps = totalSystemSteps - initialStepCount - resetOffset txt.text = currentUserSteps.toString() } override fun onAccuracyChanged(sensor : Sensor?, accuracy : Int) { if (sensor == stepSensor) { when (accuracy) { SensorManager.SENSOR_STATUS_ACCURACY_HIGH -> { Toast.makeText(this,"传感器工作在高精度状态", Toast.LENGTH_SHORT).show() } SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM -> { Toast.makeText(this,"传感器工作在中等精度状态", Toast.LENGTH_SHORT).show() } SensorManager.SENSOR_STATUS_ACCURACY_LOW -> { Toast.makeText(this,"传感器工作在低精度状态", Toast.LENGTH_SHORT).show() } SensorManager.SENSOR_STATUS_UNRELIABLE -> { Toast.makeText(this,"传感器精度不可靠", Toast.LENGTH_SHORT).show() } } } } override fun onPause() { super.onPause() sensorManager.unregisterListener(this) } }
注意事项
- Android 10(API 29)及以上版本需要先申请
ACTIVITY_RECOGNITION动态权限,才能正常获取计步传感器数据 - 上述代码的基准值默认存在内存中,App进程被杀死后会重置,如果需要跨启动保留计步数据,可以将
initialStepCount和resetOffset持久化存储到SharedPreferences中 - 如果需要支持设备重启后仍延续计步数据,需要额外搭配云端存储、或用定期记录步数的逻辑做补全
内容的提问来源于stack exchange,提问作者Kirion
相关产品推荐
相关产品推荐

