Android 安卓光传感器可检测显著的光线变化

Android 安卓光传感器可检测显著的光线变化,android,sensors,light-sensor,Android,Sensors,Light Sensor,我正在尝试使用Sensor.Type_Light或灯光传感器检测事件中的变化。值[0] @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType()== Sensor.TYPE_LIGHT) { debugView = (TextView)findViewById(R.id.lightValue); debugView.setText("Detec

我正在尝试使用Sensor.Type_Light或灯光传感器检测事件中的变化。值[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]);
    }
如您所见,这些值显示在文本视图中。另外,我们知道如果event.values[0]为0,则没有灯光,并且随着灯光的增加,该值也会增加。 现在我的问题是:如何使用这个event.values[0]来检测光线的显著变化,也就是说,如果我在足够的光线下激活传感器(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();
        }
    }
}
if(event.values[0]>=0&&event.values[0]10){
呼救();
}
}
否则{
如果(事件值[0]>15){
//照亮
if(事件值[0]<5){
呼救();
}
}
}

在sensorchange()中,您为什么不完全按照自己说的做:

if (event.values[0] > 15) {
    trigger_some_event();
}
else if (event.values[0] < 3) {
    trigger_another_event();
}
if(事件值[0]>15){
触发某个事件();
}
else if(事件值[0]<3){
触发另一个事件();
}

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

简单检查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);
        }

    }
导入android.app.Activity;
导入android.content.Context;
导入android.hardware.Sensor;
导入android.hardware.SensorEvent;
导入android.hardware.SensorEventListener;
导入android.hardware.SensorManager;
导入android.os.Bundle;
导入android.widget.ImageView;
公共类WallperChangeByLight扩展活动{
SensorManager SensorManager=null;
传感器光=零;
浮点传感器值=-1;
ImageView imgView=null;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.content\u main);
imgView=(ImageView)findViewById(R.id.imgWallpaper);
sensorManager=(sensorManager)this.getSystemService(Context.SENSOR\u服务);
light=sensorManager.getDefaultSensor(Sensor.TYPE_light);
sensorManager.registerListener(新的SensorEventListener(){
@凌驾
传感器更改时的公共无效(传感器事件){
if(event.sensor.getType()==sensor.TYPE\u LIGHT){
if(事件值[0]<3 | |事件值[0]>15){
sensorValue=事件值[0];
}
如果(传感器值<3){
imgView.setImageDrawable(getDrawable(R.drawable.ic_nolight));
}否则{
imgView.setImageDrawable(getDrawable(R.drawable.ic_light));
}
}
}
@凌驾
精度更改时的公共无效(传感器,int精度){
}
},灯,传感器管理器。传感器延迟(正常);
}
}

别忘了放可绘制的图像(ic_nolight.png,ic_light.png)

我试过了,似乎没什么效果。请参考我上面编辑的问题,了解我尝试过的代码“似乎什么都不管用”-你的确切意思是什么?此外,第一个条件是0到5之间的值,然后检查值>10,这永远不会为真。与第二个条件相同,您检查值是否大于15,然后在内部检查值是否小于5,这也永远不会是真的。首先简化你的if条件。哦,是的,我明白了。再次尝试,ThankzI还建议使用SensorManager.unregisterListener在活动暂停时注销EventListener。