본문 바로가기
Android

[Doit 깡샘의 안드로이드 앱 프로그래밍 with 코틀린] 정리 10 - 진동 알림

by 들풀민들레 2022. 2. 28.
본 글은 [Doit 깡샘의 안드로이드 앱 프로그래밍 with 코틀린 - 이지스퍼블리싱 (2022)] 의 내용을 발췌한 것입니다.

좀더 자세한 내용은 책 혹은 인강을 통해 확인해 주세요.

 

 

 

진동도 사용자 알림 효과로 많이 이용합니다. 앱에서 진동이 울리게 하려면 먼저 매니페스트 파일에 <uses-permission>으로 퍼미션을 얻어야 합니다.

 

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

진동은 Vibrator 클래스를 이용합니다. 그런데 Vibrator 객체를 얻는 방법이 API 레벨 31(Android 12)부터 변경되었습니다. 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 버전(Android 8)에서 deprecated되었습니다. 26 버전에서 새로운 함수를 제공하지만 이전 버전의 기기 사용자를 위해 여전히 사용해야 합니다. 결국 「10-1」절에서 살펴봤던 API 레벨 호환성을 고려해서 사용해야 합니다.
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)
}

createWaveform() 함수의 첫 번째와 두 번째 매개변수를 보면 각각 4개의 숫자 배열을 대입했습니다. 이렇게 하면 처음 0.5초간은 진동이 울리지 않다가 1초간 50만큼의 세기로 울리고, 다시 0.5초간 울리지 않다가 마지막 2초간 200만큼의 세기로 울립니다.