通过RxJava的Android光传感器-优化

通过RxJava的Android光传感器-优化,android,rx-java,android-sensors,light,Android,Rx Java,Android Sensors,Light,我已经用RxJava实现了光传感器。我正确地接收到lux值,但变化非常大。 例如,即使设备移动很小,值也会发生变化,并通过传感器侦听器发出 @NonNull @Override Observable<Boolean> createObservable(@NonNull Context context) { SensorManager sensorManager = (SensorManager) context.getSystemService( Co

我已经用RxJava实现了光传感器。我正确地接收到
lux
值,但变化非常大。 例如,即使设备移动很小,值也会发生变化,并通过传感器侦听器发出

@NonNull
@Override
Observable<Boolean> createObservable(@NonNull Context context) {
    SensorManager sensorManager = (SensorManager) context.getSystemService(
            Context.SENSOR_SERVICE);
    List<Sensor> sensorList = sensorManager.getSensorList(Sensor.TYPE_LIGHT);
    if (null == sensorList || sensorList.isEmpty()) {
        throw new IllegalStateException("Unsupported Sensor: Device has no light sensor");
    }

    return SensorEventObservableFactory
            .createSensorEventObservable(sensorList.get(0), sensorManager,
                    SensorManager.SENSOR_DELAY_NORMAL)
            // Ambient light level in SI lux units
            .map(sensorEvent -> sensorEvent.values[0])
            // Make sure the lux value is valid
            .filter(lx -> !(null == lx || lx < 0))
            // Detect if light or dark environment
            .map(lx -> {
                Timber.d("new LX value = %s", lx);
                // Over 15 lx means it is a light environment
                // Bellow 15 lx means it is a dark environment
                return lx > 15f;
            })
            .distinctUntilChanged();
}
@NonNull
@凌驾
可观察createObservable(@NonNull上下文){
SensorManager SensorManager=(SensorManager)context.getSystemService(
传感器(U服务);
List sensorList=sensorManager.getSensorList(传感器类型\灯);
if(null==sensorList | | sensorList.isEmpty()){
抛出新的IllegalStateException(“不支持的传感器:设备没有光传感器”);
}
返回传感器事件可观测性
.createSensorEventObservable(sensorList.get(0)、sensorManager、,
传感器管理器。传感器(延迟(正常)
//以国际单位制勒克斯为单位的环境光照水平
.map(sensorEvent->sensorEvent.values[0])
//确保勒克斯值有效
.filter(lx->!(null==lx | | lx<0))
//检测环境是亮还是暗
.map(lx->{
木材d(“新LX值=%s”,LX);
//超过15 lx意味着它是一个光环境
//Bellow 15 lx表示这是一个黑暗的环境
返回lx>15f;
})
.distinctUntilChanged();
}
我怎样才能避免这个问题?我一直在想我可以在事件之间增加一个延迟,但这可能会使我在检测速度不是很快的情况下陷入环境模式的风险很高。我已经为此挣扎了几个小时,对于如何有效地检测环境光,我已经没有主意了


提前谢谢。

与Rx本身无关,但您可以得到一批N个大小的测量值,对它们进行平均,然后根据数据采取行动。我使用
buffer()
方法尝试了这一点,但我得到的数据无效,因为只有最后一个值是相关的。我添加了一些优化,以避免产生许多不感兴趣的结果。Edson Menegatti所描述的(移动平均)似乎是降低结果方差的一个好选择。查看:它显示为最终操作(在subscriber中,但您可以通过一些工作将其转换为操作员。假设我收到一批3个值:
150、149、5
。如果亮度低于15,则表示它非常暗(我对暗环境感兴趣)。如果我做平均值,我将得到
101
lux单位作为结果。因此,我无法正确检测黑暗环境。如果这不是您建议的方法,请发布详细的答案。谢谢。与Rx本身无关,但您可以得到一批N大小的测量值,将其平均,然后根据我尝试的数据采取行动这是通过使用
buffer()
方法实现的,但我得到的是无效数据,因为只有最后一个值是相关的。我添加了一些优化,以避免产生许多不感兴趣的结果。Edson Menegatti所描述的(移动平均)这似乎是降低结果方差的一个很好的选择。请注意:它显示为最终操作(在订阅服务器中,但您可以通过一些工作将其转换为运算符。假设我收到一批3个值:
150、149、5
。如果勒克斯低于15,则表示它非常暗(我对暗环境感兴趣)。如果我做平均值,结果将得到
101
lux单位。因此,我无法正确检测黑暗环境。如果这不是您建议的方法,请发布详细答案。谢谢。