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

7
我正在尝试编写一个非常基本的光度计应用程序,以便将我的Galaxy S2作为传感器与我的旧35毫米相机配合使用。
首先,我应该指出,这款手机有一个隐藏/测试模式,可以通过在拨号键盘上输入“星号井零星号井”,然后选择“传感器”来进行选择。这将使光传感器可用,显示Lux值范围,在光水平变化时,值从5到2000以上,步长为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] );

        }
    }
}

有人能提供为什么会出现这种情况的建议吗?

我看到了这个问题:Nexus One上的光传感器只返回两个不同的值,但是这并没有帮助我。我不明白为什么内置测试模式可以看到完整的范围,而我的代码却不能。


这样一个有点复杂的问题,50个声望分数不是有点少了吗? :p - poitroae
@Michael:那你浪费了时间,不是吗?如果你认为这种态度会让你在Stack Overflow上受欢迎,那你就大错特错了。 - NickT
2个回答

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();

这真的有效!谢谢。我以为它需要 root 权限,但实际上不需要。 - NickT

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。我不知道为什么会发生这种情况。


手机只有一个光传感器,它是由Capella Microsystems公司制造的CM3663光传感器。这是可以预料的,因为我想不出为什么设备会有两个或更多这样的传感器。 - NickT
在文档中,我发现设备上可能有多个传感器。getDefaultSensor 可以返回第一个传感器,也可以创建一个虚拟传感器,它将取多个真实传感器的平均值。然而,试着将你的手机放在灯下,并检查你的传感器的最大范围。 - Yury
我已经获得了一个类型为Sensor.TYPE_LIGHT的传感器列表。其中有一个条目如上所述。它的最大范围是3000.0。当然,我把手机放在明亮的光线下。它读取到1000.0。 - NickT

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