2011-12-17 6 views
7

Sto provando a codificare un'applicazione di lightmeter molto semplice da utilizzare con le mie vecchie fotocamere 35mm utilizzando il mio Galaxy S2 come sensore.Codice del sensore di luce che restituisce un intervallo di valori limitato

Prima di tutto desidero sottolineare che è disponibile una modalità di prova nascosta su questo telefono immettendo asterisco stella a stella zero, sul tastierino numerico quindi selezionando "sensore". Questo rende disponibile il sensore di luce che mostra una gamma di valori Lux variabili tra 5 e oltre 2000 in incrementi di 5, in quanto varia il livello di luce.

La semplice dimostrazione del codice concettuale che ho scritto mi mostrerà solo tre valori, ovvero 10, 100 e 1000 sulla stessa gamma di condizioni di illuminazione. Il mio codice è:

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

     } 
    } 
} 

Qualcuno può suggerire perché questo potrebbe essere?

Ho visto la domanda Light sensor on Nexus One returns only two distinct values che non ha aiutato affatto. Non riesco a capire come la modalità di test integrata possa vedere l'intera gamma e il mio codice non possa.

+0

Aren 't 50 rep un po' meno per una domanda così complicata? : p – poitroae

+0

@ Michael: hai sprecato il tuo tempo allora vero? Se pensi che questo tipo di atteggiamento ti renderà popolare su Stack Overflow, ti sbagli di grosso. – NickT

risposta

4

ho testato solo questo sul Galaxy S2, ma l'unico modo ho potuto vedere il vero valore è stato quello di ottenere direttamente il file system dispositivo:

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

o in java:

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

Questo funziona davvero! Grazie. Pensavo che avrebbe avuto bisogno dei privilegi di root, ma non è così. – NickT

0

Forse c'è un altro sensore di luce che viene utilizzato di default dal sistema. Ho scritto un'applicazione che invia semplicemente le informazioni sui sensori:

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

È possibile testare il dispositivo. Considerando diversi valori su Nexus One. Ho provato la tua applicazione su Nexus One e all'inizio ho ricevuto solo due valori 10 e 225. Ma poi ho messo il telefono sotto la lampada e ho ricevuto molti valori. Ma l'insieme dei valori è limitato mentre la risoluzione del sensore è 1f. Non so perché questo succede.

+0

Il telefono ha solo un sensore di luce, che è un sensore di luce CM3663 prodotto da Capella Microsystems, Inc. Questo è solo per essere previsto, poiché non riesco a pensare a nessun motivo per cui un dispositivo avrebbe due o più sensori di questo tipo. – NickT

+0

Nella documentazione ho trovato che ci possono essere diversi sensori nel dispositivo. getDefaultSensor può restituire solo il primo sensore, oppure può creare un sensore falso che impiega la media di diversi sensori reali. Tuttavia, prova a mettere il telefono sotto la lampada e controlla anche il valore massimo del sensore. – Yury

+0

Avevo già ricevuto un elenco di sensori di tipo Sensor.TYPE_LIGHT. C'era una voce in essa come descritto. La sua portata massima è 3000.0. Ovviamente ho messo il telefono sotto una luce intensa. Legge 1000.0. – NickT

Problemi correlati