【问题标题】:Android Light Sensor to detect significant light changeAndroid Light Sensor 可检测显着的光线变化
【发布时间】:2015-01-07 09:09:35
【问题描述】:

我正在尝试使用 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] 来检测光线的显着变化,也就是说,如果我在足够的光线下激活我的传感器(event.values[0] >15),它应该能够触发灯关闭时的事件(event.values[0]

提前致谢

我在 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();
        }
    }
}

【问题讨论】:

  • '似乎没有任何效果' - 你到底是什么意思?此外,您的第一个条件是从 0 到 5 的值,然后您检查值 > 10,这永远不会是真的。与第二个条件相同,您检查值 > 15,然后在内部检查值
  • 哦,是的..我明白了。再试一次,谢谢

标签: android sensors light-sensor


【解决方案1】:

onSensorChanged()里面,你为什么不按你说的去做:

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

【讨论】:

  • 我试过了,似乎没有任何效果。有关我尝试过的代码,请参阅我上面编辑过的问题。
【解决方案2】:

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

仅检查 onChanged 方法中的值的解决方案将不起作用,因为从值“3”到值“0”的变化不是显着变化,但会被检测到。

你需要的只是一个变量来记住上一个灯光事件的值。

在活动范围内(不在事件回调内)声明一个变量,并将其称为“previousLightValue”

然后在 onSensorChanged 方法中,您可以将 event.values[0] 与 previousLightValue 变量进行比较,并且仅在更改高于您决定的某个阈值时“做出反应”。

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

请记住,您需要先初始化“previousLightValue”变量,然后才能使用它进行比较。所以检测 onSensorChanged 事件的第一次出现,只将值存储在“previousLightValue”中,而不做检查。从那时起,你就可以走了。

【讨论】:

    【解决方案3】:

    => 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)

    【讨论】:

    • 我还建议使用 SensorManager.unregisterListener 取消注册 EventListener onPause 活动。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 2014-08-12
    • 2023-03-25
    • 2018-05-07
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多