움직임, 방향 및 다양한 환경 조건을 측정하는 센서가 내장
인터페이스 4가지를 사용한다.
센서를 관리하고 이용할 수 있도록 하는 클래스
센서 이벤트 리스너 등록, 센서의 값을 얻어올 수 있음
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"
}
SensorManager를 통해 활용하고자 하는 유형의 센서 클래스 생성 가능
센서를 통해 발생하는 이벤트의 정보를 담고있는 객체
-> accuracy, sensor, timestamp, values
SensorEventListener
센서 값이 변경되었을 때 SensorManager에서 이벤트 형태로 값을 전달받을 수 있도록 전달함
SensorManager의 registerListener 메소드로 리스너를 등록한다.
registerListener(SensorEventListener listener, Sensor sensor, int samplingPeriodUs)
습도, 조도, 압력, 온도의 4가지 종류의 환경 센서가 있다.
앱을 다운하기 전에 해당 기능을 실행할 장치가 있는지 확인하여 장치가 없으면 실행을 할 수 없도록 제한하고 있다.
하지만 uses-featue을 설정하고 false로 값을 하면 장치가 없어도 앱을 다운받아 실행하도록 할 수 있다.
동작 센서는 manifest 권한 설정이 들어간다
<uses-permission android:name = "android.permission.ACTIVITY_RECOGNITION"/>
이는 runtime permission 이므로 코드 상에서 권한 부여 확인 코드를 만들어줘야 한다.
**권한을 받고 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)
3차원 공간에서의 회전각 속도에 대한 값을 알려줌
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
gyroSensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE)