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만큼의 세기로 울림
'Kotlin' 카테고리의 다른 글
[Kotlin / Android] 10. 다이얼로그와 알림 이용하기 - 알림 띄우기 (0) | 2024.03.20 |
---|---|
[Kotlin / Android] 10. 다이얼로그와 알림 이용하기 - 다양한 다이얼로그 (3) | 2024.03.19 |
[Kotlin / Android] 10. 다이얼로그와 알림 이용하기 - 퍼미션 설정하기 (1) | 2024.03.18 |