安卓光传感器 - 检测重要的光变化

7

我对安卓中的传感器使用很陌生,现在有些困惑。我需要只在光线发生显著变化时执行某些操作,例如在黑暗房间中打开灯光。到目前为止,我的默认实现非常简单。我该如何告诉系统只有在光线发生显著变化时才做出反应?

public class MainActivity extends Activity implements SensorEventListener {

private SensorManager mSensorManager;
private Sensor mLight;
private RelativeLayout mLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
    mLayout = (RelativeLayout) findViewById(R.id.mLayout);
    mLayout.setKeepScreenOn(true);
}

@Override
protected void onResume() {
    mSensorManager.registerListener(this, mLight,
            SensorManager.SENSOR_DELAY_FASTEST);
    super.onResume();
}

@Override
protected void onPause() {
    mSensorManager.unregisterListener(this);
    super.onPause();
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
    if (sensor.getType() == Sensor.TYPE_LIGHT) {

        // TODO
    }

}

@Override
public void onSensorChanged(SensorEvent event) {

    if (event.sensor.getType() == Sensor.TYPE_LIGHT) {

        // TODO
    }

  }

}
2个回答

17

尝试以下代码:

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.app.Activity;
import android.widget.TextView;

public class MainActivity extends Activity {

 TextView textLIGHT_available, textLIGHT_reading;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textLIGHT_available 
         = (TextView)findViewById(R.id.LIGHT_available);
        textLIGHT_reading 
         = (TextView)findViewById(R.id.LIGHT_reading);

     SensorManager mySensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);

     Sensor lightSensor = mySensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
     if(lightSensor != null){
      textLIGHT_available.setText("Sensor.TYPE_LIGHT Available");
      mySensorManager.registerListener(
        lightSensorListener, 
        lightSensor, 
        SensorManager.SENSOR_DELAY_NORMAL);

     } else {
      textLIGHT_available.setText("Sensor.TYPE_LIGHT NOT Available");
     }
    }

    private final SensorEventListener lightSensorListener
     = new SensorEventListener(){

   @Override
   public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // TODO Auto-generated method stub

   }

   @Override
   public void onSensorChanged(SensorEvent event) {
    if(event.sensor.getType() == Sensor.TYPE_LIGHT){
     textLIGHT_reading.setText("LIGHT: " + event.values[0]);
    }
   }

    };

}

如果我理解正确,灯光变化数据存储在“values”数组中? - Droidman
1
问题是如何检测光线变化是否显著,您的实现会对任何变化做出反应。 - Droidman
1
是的,使用以下方式:public void onAccuracyChanged(Sensor sensor, int accuracy) { msg.insert(0, sensor.getName() + " 精度变化: " + accuracy + (accuracy==1?" (低)":(accuracy==2?" (中)":" (高)")) + "\n"); text.setText(msg); text.invalidate(); } - Yogesh Tatwal
请稍等一下,以便我测试您的解决方案并在情况下标记为已接受。我遇到了一些Java问题,无法启动IDE。在解决问题后,我将立即进行测试。 - Droidman

0
如果只有一个轻微的变化,你可以检查一下光感传感器的值是否为0。但是,如果你发现某种奇怪的变化,比如27到20,那么我认为你可能需要使用机器学习。

2
你能解释得更详细一些吗?我认为对于这样一个简单的、单一维度的信号来说,这是一种过度杀伐了。 - Antek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接