본문 바로가기
Android/Android Core

[Android/Kotlin] 비상 사운드 효과 구현: 강제 볼륨 조절

by quessr 2024. 12. 13.

 

비상 상황에서 긴급 신고를 했을 때, 기기의 볼륨이 꺼져 있거나 낮게 설정되어 있는 경우에도 사운드 알림이 들릴 수 있도록 하는 기능이 필요했습니다.

처음에는 AudioManager.STREAM_ALARM 타입으로 설정되어 있어 강제로 볼륨을 올리는 기능이 제대로 작동하지 않았습니다.

하지만 이를 AudioManager.STREAM_MUSIC 타입으로 변경한 후 정상적으로 동작하게 되었고, 이 과정을 통해 얻은 구현 방법을 공유하고자 합니다.

구현 코드

아래 코드는 기기의 볼륨을 강제로 최대치로 설정하고 비상 사이렌 소리를 재생하는 방법을 보여줍니다.

private fun emergencyEffect(isPlay: Boolean) {
    if (isPlay) {
        // AudioManager 시스템 서비스를 가져옵니다
        val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager

        // 미디어 스트림 볼륨을 최대치로 설정합니다
        audioManager.setStreamVolume(
            AudioManager.STREAM_MUSIC,
            audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC),
            AudioManager.FLAG_PLAY_SOUND
        )

        // MediaPlayer를 초기화하고 비상 사운드를 재생하도록 설정합니다
        mediaPlayer = MediaPlayer.create(this, R.raw.siren).apply {
            setAudioAttributes(
                AudioAttributes.Builder()
                    .setUsage(AudioAttributes.USAGE_ALARM)
                    .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                    .build()
            )
            setVolume(1.0f, 1.0f) // 최대 볼륨으로 설정
            isLooping = true // 사운드를 반복 재생
            start() // 사운드 재생 시작
        }
    } else {
        // MediaPlayer가 재생 중이라면 정지하고 해제합니다
        mediaPlayer?.apply {
            if (isPlaying) {
                stop()
            }
            release()
        }
        mediaPlayer = null
    }
}

 

구현 포인트

1. AudioManager 접근

AudioManager 시스템 서비스를 사용해 기기의 오디오 설정을 제어합니다.

val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager

 

이를 통해 오디오 볼륨 및 스트림 관련 작업을 수행할 수 있습니다.

2. 볼륨을 최대치로 설정

setStreamVolume을 사용해 STREAM_MUSIC 스트림의 볼륨을 최대로 설정합니다.

  AudioManager.STREAM_MUSIC
    audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC),
    AudioManager.FLAG_PLAY_SOUND
)

 

  • STREAM_MUSIC: 음악 및 사운드 효과와 관련된 미디어 스트림입니다.
  • getStreamMaxVolume: 지정된 스트림의 최대 볼륨을 반환합니다.
  • FLAG_PLAY_SOUND: 볼륨 변경 시 피드백 사운드를 재생합니다.

참고: 초기에는 STREAM_ALARM 타입을 사용했으나, 이 경우 볼륨 강제 조정이 제대로 작동하지 않았습니다. STREAM_MUSIC으로 변경한 후에야 기능이 의도대로 작동했습니다. STREAM_MUSIC은 미디어 재생과 관련된 스트림으로, 대부분의 상황에서 강제로 볼륨을 올리는 데 적합합니다.

 

3. MediaPlayer 설정

MediaPlayer를 초기화하고 비상 사운드(R.raw.siren)를 재생합니다. AudioAttributes를 설정해 사운드가 알람 용도로 인식되도록 합니다.

mediaPlayer = MediaPlayer.create(this, R.raw.siren).apply {
    setAudioAttributes(
        AudioAttributes.Builder()
            .setUsage(AudioAttributes.USAGE_ALARM)
            .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
            .build()
    )
    setVolume(1.0f, 1.0f) // 좌우 볼륨을 최대치로 설정
    isLooping = true // 사운드를 반복 재생
    start()
}

 

4. 비상 사운드 정지

비상 상태가 종료되면 사운드를 정지하고 MediaPlayer를 해제합니다:

mediaPlayer?.apply {
    if (isPlaying) {
        stop()
    }
    release()
}
mediaPlayer = null

이는 리소스를 해제하고 메모리 누수를 방지합니다.

 

결론

위와 같은 방법으로, 사용자가 긴급 신고를 했을때, 기기의 현재 볼륨 설정과 상관없이 비상 사운드가 재생되도록 구현 가능했습니다.

 


참고: https://developer.android.com/reference/android/media/AudioManager 

 

AudioManager  |  Android Developers

android.icu.math

developer.android.com

 

반응형