光传感器代码返回有限的值范围

时间:2011-12-17 15:20:19

标签: android

我尝试编写一个非常基本的测光表应用程序,用于我的旧35mm相机,使用我的Galaxy S2作为传感器。

我首先应该指出,通过在拨号盘上输入星形哈希零星哈希选择'传感器&#,可以选择此手机上的隐藏/测试模式39 ;.这使得光传感器可以显示一系列Lux值,在5和5之间以5为步长变化,因为我可以改变光线水平。

我编写的非常简单的概念证明代码只会向我显示三个值,即在相同的照明条件范围内分别为10,100和1000。我的代码是:

public class LightMeterActivity extends Activity implements SensorEventListener {

    private SensorManager mSensorManager;
    private Sensor mLightSensor;
    private float mLux = 0.0f;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
    }

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

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

    @Override
    public void onAccuracyChanged(Sensor arg0, int arg1) {}

    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_LIGHT) {
            mLux = event.values[0];
            String luxStr = String.valueOf(mLux);
            TextView tv = (TextView) findViewById(R.id.textView1);
            tv.setText(luxStr);
            Log.d("LUXTAG", "Lux value: " + event.values[0] );

        }
    }
}

有人可以说明为什么会这样吗?

我看到了问题Light sensor on Nexus One returns only two distinct values 这根本没有帮助。我无法理解内置测试模式如何看到整个范围,而我的代码也不能。

2 个答案:

答案 0 :(得分:4)

我只在Galaxy S2上测试了这个,但我能看到真正价值的唯一方法就是直接将它直接输入系统设备文件:

#cat "/sys/devices/virtual/lightsensor/switch_cmd/lightsensor_file_state"

或在java中:

Scanner st = new Scanner(new File("/sys/devices/virtual/lightsensor/switch_cmd/lightsensor_file_state"));
int lux = st.nextInt();
st.close();

答案 1 :(得分:0)

可能系统默认使用另一个光传感器。我写了一个简单输出传感器信息的应用程序:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

    mLightSensorList = mSensorManager.getSensorList(Sensor.TYPE_LIGHT);
    tvSensorList = (TextView) findViewById(R.id.tvSensorList);
    StringBuilder sensorInfo = new StringBuilder("");
    if (mLightSensorList != null) {
        Log.d("Yury", mLightSensorList.toString());
        for (Sensor s : mLightSensorList) {
            sensorInfo.append("Sensor name: ");
            sensorInfo.append(s.getName());
            sensorInfo.append(" vendor: ");
            sensorInfo.append(s.getVendor());
            sensorInfo.append(" ver.: ");
            sensorInfo.append(s.getVersion());
            sensorInfo.append(" resolution: ");
            sensorInfo.append(s.getResolution());
            sensorInfo.append(" maxRange: ");
            sensorInfo.append(s.getMaximumRange());
            sensorInfo.append("\n");
        }
        tvSensorList.setText(sensorInfo.toString());
    }



    mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
}

您可以测试您的设备。 考虑到Nexus One上的几个值。我在Nexus One上测试了你的应用程序,起初我只收到了两个值10和225.然后我把手机放在灯下并收到了很多值。但是这些值的集合是有限的,而传感器的分辨率是1f。我不知道为什么会这样。