You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 01:24:04