알림음은 안드로이드 시스템에 등록된 소리를 사용할 수 있다. 안드로이드 시스템은 알림(NOTIFICATION), 알림(ALARM), 벨소리(RINGTONE) 등의 소리를 제공하며 이 소리는 RingtonManager로 얻을 수 있다.
// 소리 얻기 val notification: Uri = RingtonManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) val ringtone = RingtoneManager.getRingtone(applicationContext, notification) ringtone.play()
먼저 RingtonManager.getDefaultUri() 함수를 사용해 소리의 식별값을 얻는다. 이 식별값은 Uri 객체이며 이 값을 RingtonManager.getRingtone() 함수의 두번째 매개변수로 전달하면 소리를 재생하는 Ringtone 객체를 얻는다.
이번에는 앱에서 자체 음원을 준비해서 재생하는 방법을 진행한다.
음원 리소스 디렉터리는 res/raw이다.
음원을 재생하는 클래스는 MediaPlater로 이 클래스에 리소스 정보를 지정하고 start()함수를 호출하면 음원이 재생된.val player: MediaPlayer = MediaPlayer.create(this, R.raw.fallbackring) player.start()
진동도 사용자 알림 효과로 많이 사용된다. 앱에서 진동이 울리게 하려면 먼저 manifest 파일에 uses-permission태그로 퍼미션을 얻어야 한다.
<uses-permission android:name="android.permission.VIVRATE" />
진동은 Vivrator 클래스를 사용한다. 그런데 Vibrator 객체를 얻는 방법이 API 레벨 31부터 변경되었다. 31 이전 버전에서는 VIBRATOR_SERVICE로 식별되는 시스템 서비스를 이용했지만, 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부터 제공한 진동 알림 함수가 26버전에서 deprecated 되었다. 26버전에서 새로운 함수를 제공하지만 이전 버전의 기기 사용자를 위해 여전히 사용해야 한다.
- open fun vibrate(milliseconds: Long): Unit
- open fun vibrate(pattern: LongArray!, repeat: Int): Unit
첫 번째 함수는 500으로 설정하면 0.5초간 진동이 울리는 방식이다.
두 번째 함수는 500, 1000, 500, 2000,의 배열값을 전달하면 0.5초 쉬고 1초간 울리고 0.5초 쉬고 2초간 울리는 방식이다. 두 번째 매개변수로 -1로 지정하면 반복하지 않고 패턴대로 한 번만 진동이 울리고, 0으로 지정하면 코드에서 cancel() 함수로 진동 알림을 끄지 않는 한 패턴대로 계속 울린다.
API 레벨 26부터는 진동 정보를 VibrationEffect 객체로 지정할 수 있는 함수를 제공한다. VibrationEffect 객체로는 진동이 울리는 시간 이외에 진동의 세기까지 제어할 수 있다.
- open fun vibrate(vibe: VibrationEffect!): Unit
vibrate() 함수의 매개변수에 VibrationEffect 객체를 지정한다. VibrationEffect는 진동 정보를 지정하는 함수를 제공한다.
- open static fun createOneShot(milliseconds: Long, amplitude: Int): VibrationEffect!
두 번째 매개변수로 진동의 세기를 지정할 수 있으며, 진동의 세기는 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) }
첫 번째 매개변수는 진동이 울리는 시간 패턴의 배열, 두 번째 매개변수는 진동 세기 패턴의 배열이다. 세 번째 매개변수가 이 패턴의 반복 횟수이다.
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) }