如何在Kotlin开发的Android应用中通过SensorManager获取线性加速度数据
正确实现线性加速度数据展示的调整步骤
- 第一步:补全传感器监听器的注册与解绑逻辑
你当前只完成了SensorManager的初始化,没有向系统注册线性加速度传感器的监听,所以onSensorChanged不会收到对应回调。需要在Activity的生命周期方法中新增注册/解绑逻辑:
override fun onResume() { super.onResume() val linearAccelSensor = sensorManager?.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION) // 处理设备不支持线性加速度传感器的场景 if (linearAccelSensor == null) { Toast.makeText(this, "当前设备不支持线性加速度传感器", Toast.LENGTH_SHORT).show() return } // 注册监听器,第三个参数为采样率,可按需选择: // SENSOR_DELAY_NORMAL(默认,适合常规UI展示)、SENSOR_DELAY_UI(适合低频率UI更新)、SENSOR_DELAY_GAME(高刷新率,适合游戏场景) sensorManager?.registerListener(this, linearAccelSensor, SensorManager.SENSOR_DELAY_NORMAL) } override fun onPause() { super.onPause() // 页面退后台时解绑监听器,避免不必要的耗电和内存泄漏 sensorManager?.unregisterListener(this) }
- 第二步:补全
SensorEventListener接口要求的方法,同时优化onSensorChanged的健壮性
Activity实现SensorEventListener接口必须同时实现onAccuracyChanged方法,否则会出现编译错误;同时可以增加事件空校验、刷新频率控制逻辑,避免UI频繁刷新卡顿:
// 传感器精度变化回调,无需额外处理可直接空实现 override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) { } override fun onSensorChanged(event: SensorEvent?) { // 空事件直接过滤 event ?: return if (event.sensor.type != Sensor.TYPE_LINEAR_ACCELERATION) return // 控制UI刷新频率为100ms一次,可按需调整 val currentTime = System.currentTimeMillis() lastUpdatedDate?.let { last -> if (currentTime - last.time < 100) { return } } lastUpdatedDate = Date(currentTime) // event.values[0]为X轴加速度、values[1]为Y轴、values[2]为Z轴,单位均为m/s²,已扣除重力加速度影响 val showContent = "X轴:%.2f m/s²\nY轴:%.2f m/s²\nZ轴:%.2f m/s²".format( event.values[0], event.values[1], event.values[2] ) timer_since_started_detecting.text = showContent }
- 第三步:适配高版本系统权限
如果你的App目标版本是Android 12(API 31)及以上,且需要使用高采样率获取传感器数据,需要在AndroidManifest.xml中添加对应权限声明:
<uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS" />
仅常规低频率展示数据可不添加该权限。
内容的提问来源于stack exchange,提问作者Enrico Cortinovis
相关产品推荐
相关产品推荐

