2011-12-17 89 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