繁体   English   中英

Android光线感应器可检测到明显的光线变化

[英]Android Light Sensor to detect significant light change

我正在尝试使用Sensor.Type_Light或光传感器来检测event.values [0]中的更改。

@Override
public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType()== Sensor.TYPE_LIGHT) {
        debugView = (TextView)findViewById(R.id.lightValue);
        debugView.setText("Detecting...." +event.values[0]);
    }

如您所见,这些值显示在TextView中。 另外,我们知道,如果event.values [0]为0,则没有光,并且随着光的增加,该值也会增加。 现在我的问题是:如何使用event.values [0]来检测光线的显着变化,也就是说,如果我在足够的光线下激活Sensor(event.values [0]> 15),它应该能够触发灯熄灭时发生的事件(event.values [0] <3),反之亦然。

提前致谢

我在onSensorChanged中尝试了以下方法,但似乎无济于事。

if(event.values[0] >= 0 && event.values[0] <5) {
    // No Light
    if(event.values[0] > 10) {
        callForHelp();
    }
}
else {
    if(event.values[0] > 15) {
        // Light On
        if(event.values[0] < 5) {
            callForHelp();
        }
    }
}

onSensorChanged()内部,为什么不完全按照自己的意愿去做:

if (event.values[0] > 15) {
    trigger_some_event();
}
else if (event.values[0] < 3) {
    trigger_another_event();
}

您的问题是您只想在发生重大变化时做出反应。

您只需要检查onChanged方法中的值的解决方案将不会起作用,因为从值“ 3”到值“ 0”的变化不是很大的变化,但是会被检测到。

您只需要一个变量即可记住上一个灯光事件的值。

在活动范围内声明一个变量(不在事件回调中),然后将其命名为“ previousLightValue”

那么在onSensorChanged方法中,您可以将event.values [0]与previousLightValue变量进行比较,并且如果更改超出您确定的某个阈值,则只能“反应”。

您还可以检查自上次测量以来该值是下降还是上升,告诉您现在的光线是变亮还是变暗。

只需记住,需要先初始化“ previousLightValue”变量,然后才能将其用于比较。 因此,检测到onSensorChanged事件的第一次发生,并且仅将值存储在“ previousLightValue”中,而不进行检查。 从那时起,您一切顺利。

=> Xml文件布局以在屏幕上显示图像

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ImageView
            android:id="@+id/imgWallpaper"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:padding="5dp"
            android:src="@drawable/ic_img" />
    </RelativeLayout>

=>活动代码

    import android.app.Activity;
    import android.content.Context;
    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorEventListener;
    import android.hardware.SensorManager;
    import android.os.Bundle;
    import android.widget.ImageView;
    public class WallpaperChangeByLight extends Activity {
        SensorManager sensorManager = null;
        Sensor light = null;
        float sensorValue = -1;
        ImageView imgView = null;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.content_main);
            imgView = (ImageView) findViewById(R.id.imgWallpaper);
            sensorManager = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE);
            light = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
            sensorManager.registerListener(new SensorEventListener() {
                @Override
                public void onSensorChanged(SensorEvent event) {
                    if (event.sensor.getType() == Sensor.TYPE_LIGHT) {
                        if (event.values[0] < 3 || event.values[0] > 15) {
                            sensorValue = event.values[0];
                        }
                        if (sensorValue < 3) {
                            imgView.setImageDrawable(getDrawable(R.drawable.ic_nolight));
                        } else {
                            imgView.setImageDrawable(getDrawable(R.drawable.ic_light));
                        }
                    }
                }
                @Override
                public void onAccuracyChanged(Sensor sensor, int accuracy) {
                }
            }, light, SensorManager.SENSOR_DELAY_NORMAL);
        }

    }

不要忘记输入可拖动的图像(ic_nolight.png,ic_light.png)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM