비상 상황에서 긴급 신고를 했을 때, 기기의 볼륨이 꺼져 있거나 낮게 설정되어 있는 경우에도 사운드 알림이 들릴 수 있도록 하는 기능이 필요했습니다.
처음에는 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
'Android > Android Core' 카테고리의 다른 글
[Android/Kotlin] ViewModel 개념과 ViewModelStore를 통한 구성 변경 시 상태 유지 원리 (0) | 2025.03.10 |
---|---|
[Android] Activity 생명주기 정리 (0) | 2025.02.24 |
[Android/Kotlin] 뒤로가기 기능을 구현하는 방법: OnBackPressedDispatcher 활용법 (0) | 2024.12.03 |
[Android/Kotlin] Kakao Map V2: 특정 좌표를 모두 화면에 표시하기 (0) | 2024.12.02 |
[Android/Kotlin] API Key 숨기기: buildConfigField 활용법 (2) | 2024.12.02 |