본문 바로가기
Kotlin

[Kotlin / Android] 10. 다이얼로그와 알림 이용하기 - 소리와 진동 알림

by 쀼르쀼르 2024. 3. 19.

10-4 소리와 진동 알림


 

 

소리 알림

 

알림음

- 짧은 소리로 특정한 상황을 알릴 때 사용

- 문자나 카카오톡 같은 앱에서 새로운 메시지를 전달받으면
  사용자 알림 효과로 짧은 소리를 이용해 알려 주는 목적으로 사용

 

알림음은 자체 녹음한 음원을 쓸 수도 있지만

안드로이드 시스템에 등록된 소리를 이용할 수도 있음


시스템에 등록된 소리를 이용하는 방법

안드로이드 시스템은

알림(NOTIFICATION), 알람(ALAM), 벨소리(RINGTONE) 등의 소리를 제공하며

이 소리는 RingtonManager로 얻을 수 있음

 

· 소리 얻기

val notification: Uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
val ringtone = RingtoneManager.getRingtone(applicationContext, notification)
ringtone.play()

 

 

먼저 RingtoneManager.getDefaultUri( ) 함수를 이용해 소리의 식별값 얻음

이 식별값은 Uri 객체이며 이 값을 RingtoneManager.getRingtone( ) 함수의

두 번째 매개변수로 전달하면 소리를 재생하는 Ringtone 객체를 얻음

Ringtone 객체의 play( ) 함수를 호출하면 소리가 재생됨


앱에서 자체 음원을 준비해서 재생하는 방법

음원 파일은 리소스로 등록해서 이용해야 함

음원 리소스 디렉터리는 res/raw임

음원 리소스 디렉터리

 

MediaPlayer

- 음원을 재생하는 클래스

- 이 클래스에 리소스 정보 지정하고 start( ) 함수 호출하면 음원 재생됨 

 

· 음원 재생하기

val player: MediaPlayer = MediaPlayer.create(this, R.raw.fallbackring)
player.start()

 


 

진동 알림

 

진동도 사용자 알림 효과로 많이 이용함

 

앱에서 진동 울리게 하려면

매니페스트 파일에 <uses-permission>으로 퍼미션 얻어야 함

 

· 진동 퍼미션 얻기(매니페스트 파일)

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

 

진동은 Vibrator 클래스를 이용함

 


Vibrator 객체 얻는 방법

 

API 레벨 31(Android 12) 이전 버전

  • VIBRATOR)SERVICE로 식별되는 시스템 서비스 이용

API 레벨 31 버전부터

  • VIBRATOR_MANAGER_SERVICE로 식별되는
    VibratorManager라는 시스템 서비스를 얻고
    이 서비스에서 Vibrator를 이용해야 함

· 진동 객체 얻기

val vibrator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    val vibratorManager = this.getSystemService(Context.VIBRATOR_MANAGER_SERVICE)
                          as VibratorManager
    vibratorManager.defaultVibrator;
} else {
    getSystemService(VIBRATOR_SERVICE) as Vibrator
}

 


시간과 패턴을 지정해 진동 울리기(API 레벨 1부터 제공하는 함수)

 

API 레벨 1부터 제공한 진동 알림 함수가 26 버전

(Android 8)에서 deprecated*

26 버전에서 새로운 함수 제공하지만

이전 버전의 기기 사용자를 위해 여전히 사용해야 함

결국 API 레벨 호환성 고려해서 사용해야 함

* deprecated는 사용을 보장할 수 없으니 더는 사용하지 말라는 뜻

 

 

API 레벨 1부터 제공했다가 deprecated된 진동 알림 함수

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

 

첫 번째 함수의 매개변수Long 타입 하나이며 진동이 울리는 시간을 의미함

만약 500으로 설정하면 0.5초간 진동이 울림

 

두 번째 함수는 매개변수가 2개이며 진동을 반복해서 울리는 함수

 

첫 번째 매개변수에는 진동 패턴을 배열로 지정

만약 500, 1000, 500, 2000의 배열값을 전달하면

0.5초 쉬고 1초간 울리고 0.5초 쉬고 2초간 울림

 

두 번째 매개변수이 패턴을 얼마나 반복할지를 지정

만약 -1로 지정하면 반복하지 않고 패턴대로 한 번만 진동 울림

0으로 지정하면 코드에서 cancel( ) 함수로 진동 알림을 끄지 않는 한 패턴대로 계속 울림

 


진동의 세기까지 지정해 진동 울리기(API 레벨 26부터 제공하는 함수)

 

API 레벨 26부터 진동 정보를 VibrationEffect 객체로 지정할 수 있는 함수 제공함

VibrationEffect 객체로 진동이 울리는 시간 이외에 진동의 세기까지 제어할 수 있음

 

 

API 레벨 26에서 제공하는 진동 알림 함수

  • open fun vibrate(vibe: VibrationEffect!): Unit

 

vibrate( ) 함수의 매개변수에 VibrationEffect 객체를 지정함

VibrationEffect는 진동 정보를 지정하는 다음 함수를 제공함

  • open static fun createOneShot(milliseconds: Long, amplitude: Int): VibrationEffect!

 

이 함수로 만든 VibrationEffect 객체를 vibrate( ) 함수에 대입하면

첫 번째 매개변수의 시간 동안 진동이 울림

 

두 번째 매개변수를 이용해 진동의 세기를 지정할 수 있음

진동의 세기는 0~255 사이의 숫자로 표현함

0으로 지정하면 진동이 울리지 않음

255는 기기에서 지원하는 가장 센 강도로 울림


 

이렇게 숫자 직접 대입해도 되고

 

VibrationEffect.DEFAULT_AMPLITUDE처럼

상수를 지정해 기기가 정의한 기본 세기로 진동이 울리게 할 수도 있음

 

· 기본 세기로 진동 울리기

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

 

 

반복해서 진동을 울리는 createWaveform( ) 함수

  • open static fun createWaveform(timings: LongArray!, amplitudes: IntArray!, repeat:
    Int): VibrationEffect!

 

첫 번째 매개변수진동이 울리는 시간 패턴의 배열

두 번째 매개변수진동 세기 패턴의 배열

세 번째 매개변수는 이 패턴의 반복 횟수

 

· 패턴대로 반복해서 울리기

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    vibrator.vibrate(VibrationEffect.createWaveform(longArrayOf(500, 1000, 500, 2000),
    intArrayOf(0, 50, 0, 200), -1))
} else {
    vibrator.vibrate(longArrayOf(500, 1000, 500, 2000), -1)
}

 

이렇게 하면

처음 0.5초간은 진동이 울리지 않다가 1초간 50만큼의 세기로 울리고

다시 0.5초간 울리지 않다가 마지막 2초간 200만큼의 세기로 울림