안드로이드 코틀린 : 액티비티에서 볼륨 업/다운 키 이벤트 등록 - onKeyDown() 콜백 함수
Lucy Archive
Lucy 2023
2021. 4. 27. 14:49

Android Kotlin : Volumn Up/Down Listener in Activity - onKeyDown()

이 포스트는

액티비티에서 onKeyDown() 콜백 함수를 사용해서 키 이벤트를 처리하는 방법

에 대해 소개합니다. 프래그먼트(Fragment) 에서 키 이벤트 처리하는 방법은 아래의 링크를 참고해주세요.
 

안드로이드 코틀린 : LocalBroadcast로 프래그먼트에서 볼륨 업/다운 키 이벤트 사용

Android Kotlin : Volumn Up/Down Listener in Fragment - LocalBroadcast 이전 포스트는 Activity에서 onKeyDown() 콜백 함수를 사용해서 키 이벤트를 처리하는 방법에 대해 설명하였습니다. Fragment는 onKeyDo..

juahnpop.tistory.com

 

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로 지정하였기 때문에 내가 지정한 코드를 실행하고, 시스템 본래의 기능을 수행합니다.

실행 결과

끝까지 읽어 주셔서 감사합니다.^^

관련포스트

🤞 안드로이드(코틀린) 앱 제작하기 관련글 목록 보기

🤞 안드로이드(코틀린) 키 이벤트