2011-12-17 9 views
7

センサーとして私のGalaxy S2を使用している私の古い35mmカメラ用の非常に基本的な光度計アプリケーションをコーディングしようとしています。限定された範囲の値を返す光センサーコード

私はdialllerキーパッドは、その後、「センサー」を選択の上、星ハッシュゼロスターハッシュを入力することによって選択されたこの携帯電話で利用可能な隠し/テストモードがあることを最初にすべての指摘しなければなりません。これは光度を変えるので、5から5のステップで2000から5までの範囲のLux値の範囲を示す光センサーが利用可能になります。

私が書いた非常に簡単な証明コードは、同じ範囲の照明条件に対して3つの値、つまり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

+0

@マイケル:あなたはあなたの時間を無駄にしたのですか?そのような態度がスタックオーバーフローであなたを人気のあるものにしてくれると思うなら、間違っていると思います。 – NickT

答えて

4

私はギャラクシー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

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の2つの値しか受け取りませんでしたが、その後電話をランプの下に置き、多くの価値を得ました。しかし、センサの分解能が1fである間、値のセットは制限される。なぜこのようなことが起こるのか分かりません。

+0

携帯電話には光センサーが1つしかありません。これは、Capella Microsystems、Inc.が製造したCM3663光センサーです。これは、デバイスが2つ以上のセンサーを持つ理由はないと考えることができます。 – NickT

+0

ドキュメントには、デバイスに複数のセンサーが存在することがあります。 getDefaultSensorは、最初のセンサーだけを返すことも、いくつかの実際のセンサーの平均をとる偽のセンサーを作ることもできます。しかし、あなたの電話をランプの下に置き、センサーのmaxRangeもチェックしてください。 – Yury

+0

私はSensor.TYPE_LIGHTタイプのセンサのリストをすでに持っていました。説明したように1つのエントリがありました。最大範囲は3000.0です。もちろん私は電話を明るい光のもとに置いた。それは1000.0を読みます。 – NickT

関連する問題