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 함수를 사용하면 울리고있던 진동을 끌 수 있다.
'Tips > Android' 카테고리의 다른 글
[Android] Status Bar, Navigation Bar 없애기 (0) | 2022.07.19 |
---|---|
[Android] RecyclerView 스크롤 비활성화 (0) | 2022.05.17 |
[Android] currentTimeMillis로 절대시간 구하기 (0) | 2022.05.03 |
[Android] Binding 사용 시 모든 요소가 아무 동작도 안할 때 (0) | 2022.02.09 |
[Android] 오디오 모드 변경 및 볼륨 조절 (0) | 2022.02.07 |