본문 바로가기
Tips/Android

[Android] Vibrator 클래스로 진동 제어하기

by DevJaewoo 2022. 5. 16.
반응형

Intro

진행중인 프로젝트에서 진동 기능을 사용하게 되어 개발 중 조사한 내용을 정리해봤다.


Vibrator 인스턴스 생성

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

진동을 제어하기 위한 권한 설정 코드이다.

 

vibrator = getSystemService(Vibrator::class.java)

클래스로 getSystemService를 호출하면 SDK 버전에 관계없이 Vibrator 인스턴스를 반환해준다.

 

Android API 31부터는 Context.VIBRATOR_SERVICE가 Deprecated 되어서 String으로 받아오고싶다면 아래와 같이 처리해야 한다.

vibrator = if(Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
    getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
} else {
    (getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager).defaultVibrator
}

 

그냥 클래스로 받아오자.


Vibrator로 진동 켜기

if(Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
    vibrator.vibrate(longArrayOf(1000, 500), 0)
}
else {
    vibrator.vibrate(VibrationEffect.createWaveform(
        longArrayOf(1000, 500), 
        intArrayOf(255, 0), 
        0))
}

 

vibrator.vibrate(LongArray, Int)가 Android API 26부터 Deprecated되어서

O 버전 이상부터는 VibrationEffect.createWaveform 또는 createOneShot을 사용해야 한다.

난 repeat 기능이 필요하기 때문에 createWaveform을 사용했다.

public static VibrationEffect createWaveform(long[] timings, int[] amplitudes, int repeat)

 

첫번째 인자인 timings는 진동이 지속될 시간을 뜻한다.

위의 경우 1000, 500으로 설정했으니 각각 1초, 0.5초가 된다.

 

두번째 인자인 amplitudes는 각각의 timings의 진동 세기를 뜻한다. 0 ~ 255 범위의 값이어야 한다.

당연하겠지만 timing 배열 크기와 amplitude 배열의 크기가 같아야 한다.

둘의 크기가 다르면 IllegalArgumentException을 throw한다.

 

세번째 인자인 repeat은 반복할 timing의 index를 뜻한다. -1일 경우 반복하지 않는다.

Ex1) timing 배열의 길이가 4고, repeat이 2일 경우: 0 > 1 > 2 > 3 > 2 > 3 > 2 > 3 > ...
Ex2) timing 배열의 길이가 3이고, repeat이 0일 경우: 0 > 1 > 2 > 0 > 1 > 2 > ...

 

따라서 위의 코드는 1초간 255의 세기로 진동하고, 0.5초간 꺼질것이라는걸 알 수 있다.


Vibrator 진동 끄기

vibrator.cancel()

cancel 함수를 사용하면 울리고있던 진동을 끌 수 있다.

반응형