Android 소리와 진동 알림

timothy jeong·2021년 11월 5일
1

Android with Kotlin

목록 보기
17/69

소리 알림

사용자에게 짧은 소리로 특정한 상황을 알릴 때가 있다. 대표적으로 카카오톡 메시지가 있을텐데, 이를 알림음이라고 한다.

알림음은 자체 녹음한 음원을 쓸 수도 있지만 안드로이드 시스템에 등록된 소리를 이용할 수도 있다.

시스템 등록 소리 이용

안드로이드 시스템은 알림(notification), 알람(alarm), 벨소리(rigntone) 등의 소리를 제공하며 이 소리를 RingtonManager 로 얻을 수 있다. RingtonManager 를 통해 얻는 소리에 따라 나오는 음이 달라진다.

// 소리의 식별자 값을 얻는 과정
val notification: Uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
//val notification: Uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM)
//val notification: Uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE)

// 소리를 재생하는 Ringtone 객체 얻기
val ringtone = RingtoneManager.getRingtone(this,notification ) 

// 소리 재생하기
button.setOnClickListener {
    ringtone.play()
}

자체 음원 이용

음원 리소스는 res/raw 디렉터리에 존재해야한다. 음원을 재생하는 클래스는 MediaPlayer 이다. 이 클래스에 리소스 정보를 저장하고 play() 함수를 호출하면 음원이 재생된다.

res/raw/tada.mp3 파일이 있다고 하고 아래의 코드를 적용시키면, 버튼을 누르면 소리가 재생된다.

val media = MediaPlayer.create(this, R.raw.tada)

        button.setOnClickListener {
            Log.d("hello", "No!")
            media.start()
        }

만약 버튼이 아니라 액티비티 자체에서 소리를 재생 시키면 BGM 처럼 사용할 수 있다. 이렇게 재생된 음악은 화면을 이동해도 그대로 나오기 때문에 만약 화면 전환과 음악을 일치시키고 싶다면 액티비티 라이프 사이클에 맞춰서 mdeia.stop() 과 media.relase() 를 해줘야한다.

진동 알림

앱에서 진동을 울리게 하려면 메니페스트 파일에서 퍼미션을 얻어야 한다.

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

진동을 주기 위해서는 Vibrator 클래스를 이용한다.

val vibrator = getSystemService(VIBRATOR_MANAGER_SERVICE) as Vibrator

API level 1부터 제공되던 함수가 26 부터는 deprecated 되었으므로 26 버전을 기점으로 사용하는 함수를 나눠야한다. (API 레벨 호환성 고려)

level 1 부터 제공되었던 함수는 다음과 같다. 첫번째 함수는 얼마나 진동이 울리게 할지 시간을 정하는 것이고, 두번째 함수는 진동 패턴을 정하는 것인데, {쉬는 시간, 울리는 시간, 쉬는 시간, 울리는 식나...} 패턴으로 숫자를 입력한다. repeat을 -1 로 지정하면 반복 하지 않고, 0으로 짖어하면 코드에서 cancel() 함수로 진동 알림을 끄지 않는 한 패턴대로 계속 울린다.

open fun vibrate(milliseconds: Long): Unit
open fun vibrate(pattern: LongArray!, repeat: Int): Unit

level 26 부터는 진동을 세기까지 지정할 수 있게 되었다. vibrate() 함수에 VibrationEffect 추상 클래스 정보를 전달한다.

open fun vibrate(vibe: VibrationEffect!): Unit

VibrationEffect 클래스는 진동 정보를 지정하는 함수를 제공한다. createOneShot(진동시간, 진동 세기) 물론 진동 세기에 대해서는 자체적으로 상수를 제공한다.

  if (Build.VERSION.SDK_INT >= 26) {
            vibrator.vibrate(VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE))
        } else {
            vibrator.vibrate(500)
        }

똑같이 진동을 반복적으로 울리게 만드는 함수도 존재한다. createWavefrom(timings: LongArray!, amplitudes: IntArray!, repeat: Int): VibrationEffect!

        if (Build.VERSION.SDK_INT >= 26) {
            vibrator.vibrate(VibrationEffect.createWaveform(
                longArrayOf(500L,1000L, 500L, 2000L),
                intArrayOf(0, 50, 0, 200),
                -1))
        } else {
            vibrator.vibrate(longArrayOf(500L,1000L, 500L, 2000L), -1)
        }
profile
개발자

1개의 댓글

comment-user-thumbnail
2022년 1월 25일

좋은글 감사합니다.
다만 vibrator 객체를 초기화 할때
val vibrator = getSystemService(VIBRATOR_MANAGER_SERVICE) as Vibrator
가 아닌
val vibrator = (getSystemService(VIBRATOR_MANAGER_SERVICE) as VibratorManager).defaultVibrator
를 사용해야할듯 합니다.

답글 달기