본문 바로가기
Android 개발/Android

Vibrator 로 구현하는 안드로이드 진동

by Developer88 2023. 5. 23.
반응형

앱을 통해 사용자에게 알리는 방법중 진동은 매우 중요한 수단중 하나인데요.

오늘은 Vibrator API를 이용해서 이를 구현하는 방법에 대해서 정리해보겠습니다.

 

1. Manifest 설정

제일 먼저 해주어야 하는것은 permission을 얻는 것인데요.

다행히도 동적으로 얻어야 하는 수준의 permission은 아닙니다.

아래와 같이, manifest 에서 uses-permission만 VIBRATE에 대해서 정의해주면 됩니다.

 

 

 

2. Vibrator 객체 얻기

가장 먼저 할 일은 Vibrator객체를 얻어오는 것 입니다.

안드로이드 하드웨어와 관련된 클래스들이 그렇듯이,

getSystemService 메소드를 사용해서 객체를 얻어와야 합니다.

API23 버전(버전 M)부터는 아래와 같이 얻어오구요.

그 이전에는 Context.VIBRATOR_SERVICE 를 통해서 얻어와야 ㅏㅎㅂ니다.

 

private var vibrator: Vibrator? = null

vibrator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    getSystemService(Vibrator::class.java)
} else {
    @Suppress("DEPRECATION")
    getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
}

 

 

2. vibrate 메소드로 진동 시키기

2-1. oneShot 진동

위에서 얻어온 Vibrator 객체로 안드로이드 기기 진동을 구현해 보겠습니다.

예전에 진동시킬때 사용하던 메소드는 vibrate()인데요. 

API26(버전 O) 부터는 API 사용방법이 조금 바뀌었습니다.

createOneShot함수를 이용하면, 간단하게 한번에 몇초동안 진동시킬 수 있습니다.

 

인자로 얼마동안 진동을 줄것인지 넘겨주면 되는데요.

이 때 단위는 millisecond 입니다.

아래 코드는 1초동안 진동을 주라고 한 것이 됩니다.

 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    vibrator?.vibrate(VibrationEffect.createOneShot(1000, VibrationEffect.DEFAULT_AMPLITUDE))
} else {
    @Suppress("DEPRECATION")
    vibrator?.vibrate(1000)
}

 

 

 

2-2. createWaveForm

진동을 한번만 줄 수도 있지만,
패턴에 따라 여러차례 계속해서 하게 할수도 있습니다.

createWaveForm 은 API26부터 사용되는 API인데요.

아래와 같이 복잡한 패턴도 구현할 수 있습니다.

 

val timings = longArrayOf(0, 100, 1000, 300, 200, 100, 500, 200, 100)
val amplitudes = intArrayOf(0, 255, 0, 255, 0, 255, 0, 255, 0)
val repeat = -1 // -1은 반복 안함, 0은 반복을 의미
val effect = VibrationEffect.createWaveform(timings, amplitudes, repeat)

vibrator?.vibrate(effect)

 

 

API26이하에서도 동작할 수 있도록 아래와 같이 if 문으로 나누어 작업해 주어야 합니다. 

 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    vibrator.vibrate(VibrationEffect.createWaveform(longArrayOf(1000, 3000), 0))
} else {
    vibrator.vibrate(longArrayOf(1000, 3000), 0)
}

 

 

3. 진동의 취소

진동을 취소할 때는 cancel()을 사용하면 됩니다.

아래에서는 onDestroy 에서 진동을 취소하고, vibrator 도 null로 참조를 해지해 주었습니다.

 

override fun onDestroy() {
    super.onDestroy()
    
    vibrator?.cancel() 
    vibrator = null
}

 

728x90

댓글