티스토리 뷰



이 자료들은 팁스소프트에서 제공하는 [ 알짜배기 ] 프로그램을 이용하면 더 편리하게 볼수 있습니다.
* 알짜배기 프로그램 받기 - http://www.tipssoft.com/bulletin/tb.php/QnA/8406
* 관리자의 Tipssoft 이야기를 들어보세요 ( 트위터 ID : tipssoft )
* 안드로이드 강좌 목록 - http://www.tipssoft.com/bulletin/tb.php/old_bbs/501

일반적으로 안드로이드용 기기에서 가장 전력을 많이 소모하는 부분은 화면 출력 부분입니다.
그래서 어떤 기기의 시스템 메뉴에서는 사용자가 화면 밝기를 직접 설정하도록 하기도하고, 자동 조명
기능을 추가적으로 제공하여 현재 기기에 얼만큼의 빛이 들어오는지 측정하여 알아서 화면의 밝기를
조절하기도 합니다.
이러한 기능은 안드로이드용 기기의 좌측 상단에 있는 조도 센서를 이용하여 측정한 빛의 양에 따라서
화면의 밝기를 설정해주는 것입니다.
이번 강좌에서는 조도 센서를 통해서 현재 조도의 값을 얻는 방법에 대하여 알아보도록 하겠습니다.
센서를 사용할 때 기본적으로 사용되는 공통 루틴에 대하여 잘 모르시는 분들은 아래에 링크된 자료를
먼저 참고하여 주시기 바랍니다.
센서를 사용하기 위한 공통 루틴 : http://www.tipssoft.com/bulletin/tb.php/FAQ/1033
1. 기능 구현하기
센서가 감지한 데이터는 SensorEventListener 인터페이스의 onSensorChanged 메소드의 매개
인자로 전달됩니다. 실질 조도 값은 1개의 데이터이기때문에 SensorEvent 객체의 values[0] 에
저장되어 있으며 해당 데이터 값을 이용하여 프로그래머가 원하는 작업을 할 수 있습니다.
또한 조도 센서의 경우 센서가 측정한 값이 직전 값과 다른 경우에만 onSensorChanged 메소드를
호출하여 데이터를 전달하는데 조도 센서가 빛의 양을 민감하게 감지하지 않기때문에 리스너를 등록
할 때 명시하는 갱신주기가 어떤 값이 오더라도 비슷한 빈도로 동작합니다.
아래의 코드는 센서를 이용하여 조도를 측정하는 예제입니다.

public class CheckLightActivity extends Activity implements SensorEventListener
{
// 센서 관련 객체
SensorManager m_sensor_manager;
Sensor m_light_sensor;

int m_check_count = 0;
TextView m_check_view;
TextView m_display_view;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// 출력용 텍스트뷰를 얻는다.
m_check_view = (TextView) findViewById(R.id.check_tv);
m_display_view = (TextView) findViewById(R.id.display_tv);

// 시스템서비스로부터 SensorManager 객체를 얻는다.
m_sensor_manager = (SensorManager)getSystemService(SENSOR_SERVICE);
// SensorManager 를 이용해서 조도 센서 객체를 얻는다.
m_light_sensor = m_sensor_manager.getDefaultSensor(Sensor.TYPE_LIGHT);
}

// 해당 액티비티가 포커스를 얻으면 조도 데이터를 얻을 수 있도록 리스너를 등록한다.
protected void onResume() {
super.onResume();

m_check_count = 0;
// 센서 값을 이 컨텍스트에서 받아볼 수 있도록 리스너를 등록한다.
m_sensor_manager.registerListener(this, m_light_sensor, SensorManager.SENSOR_DELAY_UI );
}

// 해당 액티비티가 포커스를 잃으면 조도 데이터를 얻어도 소용이 없으므로 리스너를 해제한다.
protected void onPause() {
super.onPause();

// 센서 값이 필요하지 않는 시점에 리스너를 해제해준다.
m_sensor_manager.unregisterListener(this);
}

// 정확도 변경시 호출되는 메소드. 센서의 경우 거의 호출되지 않는다.
public void onAccuracyChanged(Sensor sensor, int accuracy)
{
}

// 측정한 값을 전달해주는 메소드.
public void onSensorChanged(SensorEvent event)
{
// 정확도가 낮은 측정값인 경우
if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) {
// 몇몇 기기의 경우 accuracy 가 SENSOR_STATUS_UNRELIABLE 값을
// 가져서 측정값을 사용하지 못하는 경우가 있기때문에 임의로 return ; 을 막는다.
//return;
}

// 센서값을 측정한 센서의 종류가 조도 센서인 경우
if(event.sensor.getType() == Sensor.TYPE_LIGHT) {
m_check_count++;
String str;

// 메소드 호출 횟수를 출력한다.
str = "체크 횟수 : " + m_check_count;
m_check_view.setText(str);
// 데이터 값을 출력한다.
str = "현재 조도 : " + event.values[0] + " lux";
m_display_view.setText(str);
}
}
}
2. 실행 화면


댓글