Android Kotlin : Volumn Up/Down Listener in Activity - onKeyDown()
액티비티에서 onKeyDown() 콜백 함수를 사용해서 키 이벤트를 처리하는 방법
에 대해 소개합니다. 프래그먼트(Fragment) 에서 키 이벤트 처리하는 방법은 아래의 링크를 참고해주세요.
onKeyDown() 콜백 함수
onKeyDown() 콜백 함수는 안드로이드 기기의 키가 눌러져있는 경우 호출 되는 콜백 함수입니다. MainActivity 에서 Ctrl + O 를 눌러 Override 할 수 있습니다. 아래 코드는 비어있는 MainActivity.kt 에서 onKeyDown 콜백 함수를 오버라이드 하였습니다.
※ 키에서 손이 떨어졌을 때는 onKeyUp() 콜백 함수를 오버라이드 해서 사용 할 수 있습니다.
package com.blacklog.boradcastreceiver
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.KeyEvent
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
return super.onKeyDown(keyCode, event)
}
}
KeyCode, KeyEvent
onKeyDown 함수는 KeyCode(Int), event(KeyEvent) 를 매개변수 인자로 받습니다. onKeyDown 함수는 키가 눌러졌을 떄 호출 된다고 했는데, 눌러진 키가 무엇인지에 대한 정보는 KeyCode가 가지고 있습니다. 안드로이드 스마트폰 또는 태블릿을 보면 대부분 하드웨어 물리적인 볼륨키, 전원 등의 키만 있다고 생각 할 수 있지만 안드로이드에서 키로 인식 하는 종류는 아주 많습니다. 예전엔 물리적 버튼이었으나 요즘은 디스플레이 UI로 처리되는 뒤로가기, 홈, 멀티태스킹 버튼이 있고, 블루투스 키보드와 마우스에 있는 키 등 총 288개의 키가 있습니다. 이러한 많은 키는 KeyEvent 클래스에 정의되어 있습니다. KeyEvent 클래스가 정의되어 있는 코드는 아래와 같습니다. 즉, KeyCode.KEYCODE_HOME은 홈키를 말하고, KeyCode.VOLUME_UP은 볼륨업 키를 말합니다.
public class KeyEvent extends InputEvent implements Parcelable {
/** Key code constant: Unknown key code. */
public static final int KEYCODE_UNKNOWN = 0;
/** Key code constant: Soft Left key.
* Usually situated below the display on phones and used as a multi-function
* feature key for selecting a software defined function shown on the bottom left
* of the display. */
public static final int KEYCODE_SOFT_LEFT = 1;
/** Key code constant: Soft Right key.
* Usually situated below the display on phones and used as a multi-function
* feature key for selecting a software defined function shown on the bottom right
* of the display. */
public static final int KEYCODE_SOFT_RIGHT = 2;
/** Key code constant: Home key.
* This key is handled by the framework and is never delivered to applications. */
public static final int KEYCODE_HOME = 3;
/** Key code constant: Back key. */
public static final int KEYCODE_BACK = 4;
/** Key code constant: Call key. */
public static final int KEYCODE_CALL = 5;
/** Key code constant: End Call key. */
.....
public static final int KEYCODE_VOLUME_UP = 24;
/** Key code constant: Volume Down key.
* Adjusts the speaker volume down. */
public static final int KEYCODE_VOLUME_DOWN = 25;
/** Key code constant: Power key. */
public static final int KEYCODE_POWER = 26;
/** Key code constant: Camera key.
* Used to launch a camera application or take pictures. */
public static final int KEYCODE_CAMERA = 27;
/** Key code constant: Clear key. */
public static final int KEYCODE_CLEAR = 28;
/** Key code constant: 'A' key. */
public static final int KEYCODE_A = 29;
...
}
onKeyDown()의 반환 값
onKeyDown() 콜백 함수는 Boolean 타입 값을 반환하도록 정의되어 있습니다.
true: (나만의 기능 추가) 시스템 기본 설정을 따르지 않음false: (나만의 기능 추가 + 시스템 기본 설정) 나의 기능을 수행하고 시스템 기본 동작 시나리오 진행super.onKeyDown(keyCode, event): 시스템 기본 설정을 따름
예시 : 키 이벤트
MainActivity.kt 코드 작성
비어있는 안드로이드 스튜디오 프로젝트의 MainActivity.kt 에 아래와 같이 코드를 작성합니다. Volume Up키를 누르면 "Volume Up Pressed" 토스트 메세지가 출력되고, Volume Down키를 누르면 "Volume Down Pressed" 토스트 메세지가 출력됩니다. 눌러진 키가 볼륨 업/다운 키가 아닌 경우 시스템의 기본 동작으로 설정하기 위해 super.onKeyDown(keyCode, event)를 반환합니다.
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.KeyEvent
import android.widget.Toast
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
return when(keyCode) {
KeyEvent.KEYCODE_VOLUME_UP -> {
Toast.makeText(this, "Volume Up Pressed", Toast.LENGTH_SHORT).show()
true
}
KeyEvent.KEYCODE_VOLUME_DOWN -> {
Toast.makeText(this, "Volume Down Pressed", Toast.LENGTH_SHORT).show()
true
}
else -> super.onKeyDown(keyCode, event)
}
}
}
실행 결과
위 코드를 실행하면 아래와 같이 블륨 업/다운 키 입력에 따라 토스트 메세지가 출력됩니다.
예시 : 눌러진 키 알아보기
MainActivity.kt 코드 작성
아래와 같이 MainActivity.kt 코드를 작성하면 눌러진 키가 무엇인지 알아 볼 수 있습니다. 키가 눌러지면 상수를 반환하는데 KeyEvent에 정의되 상수를 검색하면 알 수 있습니다. 저는 여러가지 블루투스 스위치가 있는데 이 스위치의 키가 무엇인지 알기 위해 아래 코드를 사용하였습니다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
Toast.makeText(this, "Pressed Key : $keyCode", Toast.LENGTH_SHORT).show()
return false
}
}
실행 결과
위 코드를 실행하면 아래와 같이 눌러진 키의 번호가 토스트 메세지로 출력됩니다. 위의 코드에서 반환값은 false로 지정하였기 때문에 내가 지정한 코드를 실행하고, 시스템 본래의 기능을 수행합니다.
끝까지 읽어 주셔서 감사합니다.^^
'Programming > Android App(Kotlin)' 카테고리의 다른 글
안드로이드 코틀린 : 동영상 촬영 후 외부저장소(앱 디렉토리)에 저장하고 미리보기 with FileProvider (3) | 2021.05.04 |
---|---|
안드로이드 코틀린 : LocalBroadcast로 프래그먼트에서 볼륨 업/다운 키 이벤트 사용 (0) | 2021.04.28 |
안드로이드 코틀린 : Pair, Triple, Data Class 여러 개의 반환 값을 가지는 메서드 또는 함수 만들기 (0) | 2021.04.21 |
안드로이드 코틀린 : 여러 개의 버튼 리스너 한 번에 처리하기 View.OnClickListener (0) | 2021.04.19 |
안드로이드 코틀린 : 일반 클래스에서 Fragment의 메서드 사용하기 (0) | 2021.04.17 |