[Android Studio] 10장 - 소리와 진동 알림

이상협·2022년 9월 14일
0

안드로이드스튜디오

목록 보기
41/43
post-custom-banner

소리 알림

알림음은 안드로이드 시스템에 등록된 소리를 사용할 수 있다. 안드로이드 시스템은 알림(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부터 제공하는 함수)

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부터 제공하는 함수)

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)
}

반복해서 진동을 울리는 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)
}

참고

  • Do it! 깡쌤의 안드로이드 프로그래밍 with 코틀린 (개정판)
post-custom-banner

0개의 댓글