본문 바로가기
Android Studio

[Android, Kotlin] Background에서 진동 울리기

by 열정적인 이찬형 2022. 10. 6.

개발을 하는 도중에 App이 Background에서 작업을 진행하다가 완료하면 진동이 울리도록 작성하였었습니다.

 

하지만 앱을 켜둔 상태에서만 진동이 울리고 Background 상태에서는 울리지 않는 것을 확인하였습니다.

 

이 문제에 대해 해결한 방법을 정리하였습니다.


Vibrator

우선 진동을 울리기 위해

 

현재 Activity에 Vibrator를 선언하기.

//저는 Fragment에서 선언하였기 때문에 requireActivity()를 사용하였습니다.
val vibrator = requireActivity().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator

 

Android Develops에서 Vibrator를 살펴보면

 

 

Vibrator  |  Android Developers

android.net.wifi.hotspot2.omadm

developer.android.com

 

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

 

VibrationEffect  |  Android Developers

android.net.wifi.hotspot2.omadm

developer.android.com

 

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  |  Android Developers

android.net.wifi.hotspot2.omadm

developer.android.com

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)
    }

 

더 좋은 방법이 존재한다면 댓글로 남겨주시면 감사하겠습니다.

댓글