개발을 하는 도중에 App이 Background에서 작업을 진행하다가 완료하면 진동이 울리도록 작성하였었습니다.
하지만 앱을 켜둔 상태에서만 진동이 울리고 Background 상태에서는 울리지 않는 것을 확인하였습니다.
이 문제에 대해 해결한 방법을 정리하였습니다.
Vibrator
우선 진동을 울리기 위해
현재 Activity에 Vibrator를 선언하기.
//저는 Fragment에서 선언하였기 때문에 requireActivity()를 사용하였습니다.
val vibrator = requireActivity().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
Android Develops에서 Vibrator를 살펴보면
public void vibrate (VibrationEffect vibe,
VibrationAttributes attributes)
Vibrate with a given effect.
(주어진 효과로 진동을 진행합니다.)
= VibrationEffect
The app should be in the foreground for the vibration to happen. Background apps should specify a ringtone, notification or alarm usage in order to vibrate.
(앱이 백그라운드에서 진동을 일으키려면 벨소리, 알림, 알람 사용으로 지정해야합니다.)
= VibrationAttributes
VibrationEffect
createOneShot(long milliseconds, int amplitude)
Create a one shot vibration.
(원샷 진동을 만듭니다.)
DEFAULT_AMPLITUDE
The default vibration strength of the device.
(장치의 기본 진동 강도입니다.)
//1초간 기본 진동 강도로 1번 울리는 Effect입니다.
val vibratorPattern = VibrationEffect.createOneShot(1000, VibrationEffect.DEFAULT_AMPLITUDE)
Audio Attribute
AudioAttributes.Builder
Builder class for AudioAttributes objects.
(AudioAttributes개체 에 대한 빌더 클래스입니다 .)
usage
"why" you are playing a sound, what is this sound used for.
("왜" 소리를 재생하는지, 이 소리는 무엇을 위해 사용되는지?)
This is achieved with the "usage" information.
(이것은 "사용" 정보로 달성됩니다.)
USAGE_ALARM
Usage value to use when the usage is an alarm
(사용량이 알람일 때 사용할 사용량 값입니다.)
content type
"what" you are playing.
(재생 중인 "무엇"입니다.)
The content type expresses the general category of the content.
(콘텐츠 유형은 콘텐츠의 일반적인 범주를 나타냅니다)
CONTENT_TYPE_SONIFICATION
Content type value to use when the content type is a sound used to accompany a user action, such as a beep or sound effect expressing a key click, or event, such as the type of a sound for a bonus being received in a game.
(콘텐츠 형식이 키 클릭을 나타내는 사운드 효과 또는 경고음과 같은 사용자 동작을 동반하는 데 사용되는 사운드 또는 게임에서 받는 보너스에 대한 사운드 형식과 같은 이벤트 형식인 경우 사용할 콘텐츠 형식 값입니다.)
//ContentType : CONTENT_TYPE_SONIFICATION
//Usage : USAGE_ALRAM
//Attribute 만들기
val audioAttributes = AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_ALARM)
.build()
실질적으로 사용한 코드
private fun setVibrate(){
//Fragment에서 사용하였기에 requireActivity()를 사용하였습니다.
val vibrator = requireActivity().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
//Attribute
val audioAttributes = AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_ALARM)
.build()
//Effect
val vibratorPattern = VibrationEffect.createOneShot(1000, VibrationEffect.DEFAULT_AMPLITUDE)
//진동 시작
vibrator.vibrate(vibratorPattern, audioAttributes)
}
더 좋은 방법이 존재한다면 댓글로 남겨주시면 감사하겠습니다.
댓글