2011-12-17 82 views
7

我想代码一个非常基本的光度计应用程序与我的旧的35毫米相机使用我的Galaxy S2作为传感器使用。光传感器代码返回有限的值范围

我应该首先指出,通过在拨号盘键盘上输入star hash zero star hash,然后选择'sensor',可以在此手机上提供隐藏/测试模式。这使得光线传感器显示的Lux值范围在5到2000之间变化,因为我改变了光照水平。

我写的概念代码的非常简单的证明将只显示三个值,即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 这个问题根本没有帮助。我无法理解内置的测试模式如何能够看到完整的范围,而且我的代码不能。

+0

AREN对于这样一个有点复杂的问题,50代表少一点? :p – poitroae 2012-01-07 01:16:43

+0

@迈克尔:你浪费了你的时间,那你不是吗?如果你认为这种态度会让你在Stack Overflow上受欢迎,那你就错了。 – NickT 2012-01-08 11:00:53

回答

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

这实际上有效!谢谢。我认为它需要root权限,但它不需要。 – NickT 2012-02-20 16:01:52

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

+0

手机只有一个光传感器,它是由Capella Microsystems,Inc.生产的CM3663光传感器。这只是我们所期望的,因为我可以想到设备没有两个或更多这种传感器的理由。 – NickT 2012-01-07 18:49:35

+0

在文档中,我发现设备中可能有多个传感器。 getDefaultSensor可以返回第一个传感器,或者可以制作一个假传感器,它将取平均数个真实传感器。但是,请尝试将手机放在灯下,并检查传感器的maxRange。 – Yury 2012-01-07 18:54:06

+0

我已经获得了Sensor.TYPE_LIGHT类型的传感器列表。描述中有一个条目。它的最大范围是3000.0。当然,我把手机放在明亮的灯光下。它读取1000.0。 – NickT 2012-01-07 19:00:35