안드로이드 센서

이영준·2023년 4월 21일
0

📌 센서란

움직임, 방향 및 다양한 환경 조건을 측정하는 센서가 내장

  • 환경 센서
  • 동작 센서
  • 위치 센서

인터페이스 4가지를 사용한다.

  • SensorManager
  • Sensor
  • SensorEvent
  • SensorEventListener

🔑 SensorManager

센서를 관리하고 이용할 수 있도록 하는 클래스
센서 이벤트 리스너 등록, 센서의 값을 얻어올 수 있음

🔑 내 센서 목록

SensorManager객체를 만들어 snesorList를 가져와 무슨 센서가 내장되어있는지 확인할 수 있다.

        val sm = getSystemService(Context.SENSOR_SERVICE) as SensorManager
        val sensors = sm.getSensorList(Sensor.TYPE_ALL)

        var sensorlist="전체 내장 센서의 수 : "+sensors.size+"\n"
        for (sensor in sensors) {
            sensorlist +=
                "name: ${sensor.name}\n" +
                "type: ${sensor.stringType}\n" +
                "power: ${sensor.power}\n"+
                "resolution: ${sensor.resolution}\n"+
                "range: ${sensor.maximumRange}\n\n"
        }

🔑 Sensor

SensorManager를 통해 활용하고자 하는 유형의 센서 클래스 생성 가능

🔑 SensorEvent

센서를 통해 발생하는 이벤트의 정보를 담고있는 객체
-> accuracy, sensor, timestamp, values
SensorEventListener

🔑 SensorEventListener

센서 값이 변경되었을 때 SensorManager에서 이벤트 형태로 값을 전달받을 수 있도록 전달함

SensorManager의 registerListener 메소드로 리스너를 등록한다.
registerListener(SensorEventListener listener, Sensor sensor, int samplingPeriodUs)

  • samplingPeriodUs는 얼마나 자주 변경된 데이터를 받을 지 설정하는 값이다.

📌 환경 센서

습도, 조도, 압력, 온도의 4가지 종류의 환경 센서가 있다.

🔑 조도 센서

+ 센서 없는 폰 앱 배포 방법

앱을 다운하기 전에 해당 기능을 실행할 장치가 있는지 확인하여 장치가 없으면 실행을 할 수 없도록 제한하고 있다.
하지만 uses-featue을 설정하고 false로 값을 하면 장치가 없어도 앱을 다운받아 실행하도록 할 수 있다.

📌 동작 센서

동작 센서는 manifest 권한 설정이 들어간다

<uses-permission android:name = "android.permission.ACTIVITY_RECOGNITION"/>

이는 runtime permission 이므로 코드 상에서 권한 부여 확인 코드를 만들어줘야 한다.

🔑 걸음 감지 센서

  • 걸음 감지기(step detector), 보행 계수기(step counter)
    만보기 어플리케이션처럼 걸음을 감지할 때 등에 주로 사용한다. step counter는 계속 걸음을 디딜때마다 총 걸음수를 더해나가준다. 반면 step detector은 한 번 움직이면 1을 반환할 뿐 더해주지는 않는다.

**권한을 받고 sensorlister를 통해 step counter 센서 listen 하기

class StepDetectorActivity : AppCompatActivity() , SensorEventListener {
    private lateinit var sensorManager: SensorManager
    private var stepCountSensor: Sensor? = null
    private lateinit var tvStepCount: TextView

//    private val TYPE = Sensor.TYPE_STEP_DETECTOR //보행 감지기
    private val TYPE = Sensor.TYPE_STEP_COUNTER //보행 계수기

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_step_detector)

        tvStepCount = findViewById(R.id.tvStepCount)
        sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
        stepCountSensor = sensorManager.getDefaultSensor(TYPE)
        if(stepCountSensor == null) {
            Toast.makeText(this, "No Step Detect Sensor!!", Toast.LENGTH_SHORT).show()
        }else{
            if(ContextCompat.checkSelfPermission(this,
                    Manifest.permission.ACTIVITY_RECOGNITION) == PackageManager.PERMISSION_DENIED){
                Toast.makeText(this, "No Permission!!", Toast.LENGTH_SHORT).show()

                //ask for permission
                requestPermissionLauncher.launch(arrayOf(Manifest.permission.ACTIVITY_RECOGNITION))

            }else{
                //권한있는 경우
            }
        }
    }

    private val requestPermissionLauncher = registerForActivityResult(
        ActivityResultContracts.RequestMultiplePermissions()){
        Log.d(TAG, "requestPermissionLauncher: 건수 : ${it.size}")

        var results = true
        it.values.forEach{
            if(it == false) {
                results = false
                return@forEach
            }
        }

        if(!results){
            Toast.makeText(this@StepDetectorActivity, "권한이 필요합니다.", Toast.LENGTH_SHORT).show()
        }else{
            //모두 권한이 있을 경우
        }
    }

    override fun onSensorChanged(p0: SensorEvent?) {
        if(p0?.sensor?.type == TYPE) {
            Log.d(TAG, "onSensorChanged: ${p0.values[0]}")
            tvStepCount.text = "Step Count Sensor : " + p0.values[0].toString()
        }
    }

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

    override fun onResume() {
        super.onResume()
        var bool = sensorManager.registerListener(this, stepCountSensor, SensorManager.SENSOR_DELAY_NORMAL)
    }

    override fun onPause() {
        super.onPause()
        sensorManager.unregisterListener(this)
    }
}

🔑 가속도 센서

가속도 센서는 움직임에 따라서 x,y,z 축의 가속도(중력 포함)을 반환해준다.

accelometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)

🔑 중력 센서

x,y,z 축의 중력의 방향과 강도를 나타낸다

gravitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY)

🔑 자이로스코프(Gyro) 센서

3차원 공간에서의 회전각 속도에 대한 값을 알려줌

        sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
        gyroSensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE)
profile
컴퓨터와 교육 그사이 어딘가

0개의 댓글