Android Light Sensor для обнаружения значительных изменений освещения
Я пытаюсь использовать Sensor.Type_Light или Light Sensor для обнаружения изменений в 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] < 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();
}
}
}
3 ответа
Внутри onSensorChanged (), почему бы вам не сделать именно то, что вы говорите, что хотите:
if (event.values[0] > 15) {
trigger_some_event();
}
else if (event.values[0] < 3) {
trigger_another_event();
}
=> 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)
Ваша проблема в том, что вы хотите реагировать только в случае значительных изменений.
Решение, при котором вы просто проверяете значение в методе onChanged, не будет работать, так как изменение значения "3" на значение "0" не является значительным изменением, однако оно будет обнаружено.
То, что вам нужно, это просто переменная, чтобы запомнить значение предыдущего легкого события.
Объявите переменную в области действия (не внутри обратного вызова события) и назовите ее что-то вроде "previousLightValue"
затем в методе onSensorChanged вы можете сравнить event.values [0] с переменной previousLightValue и "реагировать" только в том случае, если изменение превышает определенный порог, который вы выбрали.
Вы также можете проверить, уменьшилось ли значение или увеличилось с момента последнего измерения, сообщив вам, стал ли свет ярче или темнее.
Просто помните, что вам нужно инициализировать переменную "previousLightValue", прежде чем вы сможете использовать ее для сравнения. Поэтому обнаружите первое вхождение события onSensorChanged и сохраните значение только в "previousLightValue", не выполняя проверки. С этого момента, вы готовы идти.