2011-12-17 2 views
7

나는 갤럭시 S2를 센서로 사용하여 기존의 35mm 카메라와 함께 사용하기위한 매우 기본적인 라이트 미터 어플리케이션을 코딩하려고합니다.제한된 범위의 값을 반환하는 라이트 센서 코드

먼저이 전화기에 스타 해시 0 별 해시을 입력하고 dialller 키패드에서 '센서'를 선택하여 숨김/테스트 모드를 사용할 수 있음을 지적해야합니다. 이것은 빛의 레벨을 변화 시킴에 따라 5 단계에서 2000 단계까지 5 단계로 변화하는 Lux 값의 범위를 보여주는 광 센서를 제공합니다.

필자가 작성한 매우 간단한 개념 증명 코드는 같은 조명 범위에서 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

때로 믿을 수를 그처럼 복잡한 질문에 대해서는 50 명의 담당자가 조금 덜합니까? : p – poitroae

+0

@ 마이클 : 너 너 낭비 했니? 그런 태도가 스택 오버 플로우에서 인기가 있다고 생각한다면, 당신은 틀린 말입니다. – NickT

답변

4

나는 단지 갤럭시 S2에서이 테스트를하지만 진정한 가치를 볼 수있는 유일한 방법은 직접 시스템 장치 파일을 얻을 수 있었다 :

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

또는 자바 :

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

이것은 실제로 작동합니다! 고맙습니다. 루트 권한이 필요하다고 생각했지만 그렇지 않습니다. – 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 인 동안 값의 집합은 제한됩니다. 나는 이것이 왜 일어나는 지 모른다.

+0

전화에는 Capella Microsystems, Inc.에서 제조 한 CM3663 광 센서 만있는 광 센서가 하나만 있습니다.이 장치는 두 가지 이상의 센서가있는 이유가 전혀 없기 때문에 예상 할 수 있습니다. – NickT

+0

설명서에 장치에 여러 센서가있을 수 있음을 발견했습니다. getDefaultSensor는 첫 번째 센서 만 반환하거나 여러 실제 센서를 평균 처리하는 가짜 센서를 만들 수 있습니다. 그러나 휴대 전화를 램프 아래에 놓고 센서의 maxRange도 확인하십시오. – Yury

+0

나는 Sensor.TYPE_LIGHT 유형의 센서 목록을 이미 가지고있었습니다. 설명 된대로 항목이 하나 있습니다. 최대 범위는 3000.0입니다. 물론 나는 전화를 밝은 빛 아래에 두었다. 1000.0을 읽습니다. – NickT

관련 문제