我正在创建一个用于跌倒检测的应用程序,并且我正在尝试实现 RxKotlin 来做到这一点。为了提供良好的数据处理,我每 250 毫秒获取一次 sesnorEvent 并将其放入缓冲区(最后 10 秒)。不幸的是,当我移动手机时,缓冲区中的全部数据都是同一个事件。是我的代码中的问题还是它只是这样工作?
我已经尝试使用窗口和缓冲区,但是结果是一样的。应用的目标 API 为 28,最小 API 21。 SensorListener 放置在前台服务中
//initialization of the properties
private val proxy: BehaviorSubject<SensorEvent> = BehaviorSubject.create()
private var mSensorManager: SensorManager? = null
private var mAccelerometer: Sensor? = null
private lateinit var subscribe: Disposable
override fun onCreate() {
super.onCreate()
mSensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
mAccelerometer = mSensorManager!!.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
mSensorManager!!.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL)
subscribe = Observable.interval(250, TimeUnit.MILLISECONDS)
.map { proxy.value }
.buffer(1, TimeUnit.SECONDS)
.map {
it.map { sensorEvent -> calculateAcceleration(sensorEvent!!) }
}
.subscribe {
Log.d("MySensor", it.toString())
}
}
//Here I call onNext also log data for every called event
override fun onSensorChanged(event: SensorEvent?) {
proxy.onNext(event!!)
Log.d("MySensor", calculateAcceleration(event).toString())
}
private fun calculateAcceleration(event: SensorEvent): Float {
val axisX = event.values[0]
val axisY = event.values[1]
val axisZ = event.values[2]
val acceleration = sqrt(axisX.pow(2) + axisY.pow(2) + axisZ.pow(2))
//Log.d("MyDataSave", acceleration.toString())
return acceleration
}
我希望 observable 的输出类似于 [11.234473, 9.768473, 13.23543],但是,我得到 [9.768473, 9.768473, 9.768473]。要点是,在缓冲区生命周期内移动手机后,缓冲区中的值应该不同,但事实并非如此。