Archives
Recent Posts
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[52일차 Android] Sensor 본문

Computer/Android

[52일차 Android] Sensor

Wise-99 2023. 7. 20. 18:44

 

 

 

출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT

 

 

 

📖 Sensor

  • 스마트폰에는 수십가지의 센서가 장착되어 있으며 이를 통해 사용자에 대한 정보를 수집할 수 있다.
  • 스마트폰이 부팅되면 단말기에 장착되어 있는 모든 센서들이 동작하기 시작하고 애플리케이션에서는 이 값을 받아와 사용할 수 있다.

 

 

 

예제 코드

단말기 센서 목록 출력

class MainActivity : AppCompatActivity() {

    lateinit var activityMainBinding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        activityMainBinding = ActivityMainBinding.inflate(layoutInflater)

        // 센서 관리자를 가져온다.
        val sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager

        // 단말기에 있는 센서 목록을 가져온다.
        val sensorList = sensorManager.getSensorList(Sensor.TYPE_ALL)

        activityMainBinding.textView.run {
            text = ""

            // 센서 수 만큼 반복
            for(sensor in sensorList){
                append("센서 이름 : ${sensor.name}\n")
                append("센서 종류 : ${sensor.type}\n\n")
            }
        }

        setContentView(activityMainBinding.root)
    }
}

 

 

 

결과




 


Sensor 사용하기

센서 정지 버튼

// 센서로 부터 측정된 값을 받아오면 동작하는 리스너
var sensorListener:SensorEventListener? = null

...

button.run{
    setOnClickListener {
        if(sensorListener != null) {
            val sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager
            // 센서가 측정한 값을 받아올 수 있는 리스너 연결을 해제한다.
            sensorManager.unregisterListener(sensorListener)
            sensorListener = null
        }
    }
}

 

 

 

조도 센서

  • 주변 밝기를 측정하는 센서
  • lux 단위의 주변 밝기 값을 가져온다.
button2.run{
    setOnClickListener {

        // 센서 리스너가 null일 때만 동작
        if(sensorListener == null){
        
            // 리스너 객체 생성
            sensorListener = object : SensorEventListener{
            
                // 센서로부터 새로운 값이 측정될 때 호출되는 메서드
                override fun onSensorChanged(p0: SensorEvent?) {
                
                    // 매개변수로 들어오는 센서 객체로 부터 측정된 값을 가져온다.
                    textView.text = "주변 밝기 : ${p0?.values?.get(0)} lux"
                }
                
                // 센서의 정확도 혹은 감도 등의 성능의 변화가 있을 때 호출되는 메서드
                override fun onAccuracyChanged(p0: Sensor?, p1: Int) {

                }
            }
            
            // 리스너 등록
            val sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager
            
            // 조도 센서 객체를 가져온다.
            val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT)
            
            // 센서로 부터 측정된 값을 가져올 리스너를 등록한다.
            // 첫 번째 : 리스너
            // 두 번째 : 연결할 센서 객체
            // 세 번째 : 측정 주기
            
            // SensorManager.SENSOR_DELAY_FASTEST : 가장 짧은 주기(단말기 하드웨어 성능에 따라 다름)
            // SensorManager.SENSOR_DELAY_UI : 화면 주사율 주기
            // SensorManager.SENSOR_DELAY_GAME : 게임에 최적화된 주기
            // SensorManager.SENSOR_DELAY_NORMAL : 보통 주기
            
            // 조도 센서와 리스너를 연결
            // 반환값(Boolean) : 센서가 지원하지 않거나 리스너 연결에 문제가 있다면 false를 반환한다.
            val chk = sensorManager.registerListener(sensorListener, sensor, SensorManager.SENSOR_DELAY_UI)
            
            if(chk == false){
                sensorListener = null
                textView.text = "조도 센서를 지원하지 않습니다"
            }
        }
    }
}

 

 

 

기압 센서

  • 공기압을 측정하는 센서
  • 실제 공기압을 위해 사용하기도 하지만 실내에서 사용자의 고도를 측정하기 위한 용도로도 사용한다.
button3.run{
    setOnClickListener {
    
        if(sensorListener == null){
        
            // 센서 리스너
            sensorListener = object : SensorEventListener {
            
                override fun onSensorChanged(p0: SensorEvent?) {
                    textView.text = "현재 기압 : ${p0?.values?.get(0)} millibar"
                }

                override fun onAccuracyChanged(p0: Sensor?, p1: Int) {

                }
            }

            val sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager
            
            // 기압 센서 가져오기
            val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE)
            
            // 리스너와 기압 센서 연결
            val chk = sensorManager.registerListener(sensorListener, sensor, SensorManager.SENSOR_DELAY_UI)
            
            // 문제 발생 시
            if(chk == false){
                sensorListener = null
                textView.text = "기압 센서를 지원하지 않습니다"
            }
        }
    }
}

 

 

 

근접 센서

  • 대부분의 스마트폰에서 단말기 좌측 상단에 배치되어 있다.
  • 단말기와 물간의 거리를 cm 단위로 측정한다.
  • 실제 단말기에서는 가까운가 가깝지 않은가의 값만 측정된다.(0 또는 1)
button4.run{
    setOnClickListener {
        if(sensorListener == null){
            // 센서 리스너
            sensorListener = object : SensorEventListener {
                
                override fun onSensorChanged(p0: SensorEvent?) {
                    textView.text = "물체와의 거리 : ${p0?.values?.get(0)} cm"
                }

                override fun onAccuracyChanged(p0: Sensor?, p1: Int) {

                }
            }

            val sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager
            
            // 근접 센서 불러오기
            val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY)
            
            // 리스너와 근접 센서 연결
            val chk = sensorManager.registerListener(sensorListener, sensor, SensorManager.SENSOR_DELAY_UI)
            
            // 문제 발생 시
            if(chk == false){
                sensorListener = null
                textView.text = "근접 센서를 지원하지 않습니다"
            }
        }
    }
}

 

 

 

자이로 스코프 센서

  • 단위 시간당 회전한 각도 값을 측정하는 센서
  • 각속도 : 기울어짐의 대한 속도
  • 게임, 운동, 수평계 어플 등에서 스마트폰의 가속도를 측정하기 위해 사용한다.
button5.run{
    setOnClickListener {
        if(sensorListener == null){
            // 리스너
            sensorListener = object : SensorEventListener {
                override fun onSensorChanged(p0: SensorEvent?) {
                    textView.text = "X 축의 각속도 : ${p0?.values?.get(0)}"
                    textView2.text = "Y 축의 각속도 : ${p0?.values?.get(1)}"
                    textView3.text = "Z 축의 각속도 : ${p0?.values?.get(2)}"
                }

                override fun onAccuracyChanged(p0: Sensor?, p1: Int) {

                }
            }

            val sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager
            val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE)
            val chk = sensorManager.registerListener(sensorListener, sensor, SensorManager.SENSOR_DELAY_UI)
            if(chk == false){
                sensorListener = null
                textView.text = "자이로 스코프 센서를 지원하지 않습니다"
            }
        }
    }
}

 

 

가속도 센서

  • 기울어짐을 측정하는 센서
button6.run{
    setOnClickListener {
        if(sensorListener == null){
            // 리스너
            sensorListener = object : SensorEventListener {
                override fun onSensorChanged(p0: SensorEvent?) {
                    textView.text = "X 축의 기울기 : ${p0?.values?.get(0)}"
                    textView2.text = "Y 축의 기울기 : ${p0?.values?.get(1)}"
                    textView3.text = "Z 축의 기울기 : ${p0?.values?.get(2)}"
                }

                override fun onAccuracyChanged(p0: Sensor?, p1: Int) {

                }
            }

            val sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager
            val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
            val chk = sensorManager.registerListener(sensorListener, sensor, SensorManager.SENSOR_DELAY_UI)
            if(chk == false){
                sensorListener = null
                textView.text = "가속도 센서를 지원하지 않습니다"
            }
        }
    }
}

 

 

 

자기장 센서

  • 단말기 주변의 자기장을 측정한다.
  • 지구에 흐르는 자기장 값을 읽어 방향을 측정하는 용도로 사용한다.
  • 단말기의 기울어짐에 따라 값의 오차가 발생할 수 있어 실제 방위 측정에는 가속도 센서와 같이 사용해야 한다.
button7.run{
    setOnClickListener {
        if(sensorListener == null){
            // 리스너
            sensorListener = object : SensorEventListener {
                override fun onSensorChanged(p0: SensorEvent?) {
                    textView.text = "X 축 자기장 : ${p0?.values?.get(0)}"
                    textView2.text = "Y 축 자기장 : ${p0?.values?.get(1)}"
                    textView3.text = "Z 축 자기장 : ${p0?.values?.get(2)}"
                }

                override fun onAccuracyChanged(p0: Sensor?, p1: Int) {

                }
            }

            val sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager
            val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)
            val chk = sensorManager.registerListener(sensorListener, sensor, SensorManager.SENSOR_DELAY_UI)
            if(chk == false){
                sensorListener = null
                textView.text = "자기장 센서를 지원하지 않습니다"
            }
        }
    }
}