안드로이드 개발자의 창고
[52일차 Android] Sensor 본문
출처 : 안드로이드 앱스쿨 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 = "자기장 센서를 지원하지 않습니다"
}
}
}
}
'Computer > Android' 카테고리의 다른 글
[52일차 Android] 사진 촬영하기 (0) | 2023.07.24 |
---|---|
[51일차 Android] Location (0) | 2023.07.20 |
[51일차 Android] Device Information(단말기 정보 파악) (0) | 2023.07.19 |
[51일차 Android] Screen Rotation(화면 회전 대응) (0) | 2023.07.19 |
[51일차 Android] Density(해상도 대응) (0) | 2023.07.19 |