Android (안드로이드)

[Android] 앱에서 기기 볼륨 조절하기 / AudioManager (+TTS)

Oscar:) 2024. 12. 22. 12:00
728x90

 

 

 

기기의 볼륨이 꺼져있거나, 작게 설정되어 있더라도

최대 크기의 볼륨으로 음성을 출력해야하는 기능이 필요했다.

 

앱에서 기기의 볼륨을 조절하는 방법을 알아보자.

 

 

 

 


 

 

 

✅ 안드로이드 소리의 종류

 

안드로이드에서는 소리를 다음 4가지 종류로 분리하여 설정할 수 있다.

 

 

순서대로 [시스템] · [알림] · [벨소리] · [미디어]

 

- 시스템

앱과 관계 없이 기기 내에서 발생하는 기본적인 소리에 해당한다.

 

- 알림

문자, 카톡 등 Push 알림(Notification)이 울리는 소리에 해당한다.

 

- 벨소리

전화가 수신될 때 울리는 소리다.

 

- 미디어

음성 파일, 동영상 등 미디어에 적용되는 소리이며,

보통 앱에서 발생하는 소리도 미디어에 포함된다.

 

 

 

 

 

 

✅ 볼륨 조절

 

앱에서 발생하는 소리에 해당하는 미디어 볼륨을 조절해보자.

 

MainActivity.kt

button.setOnClickListener {
  // AudioManager 초기화
  val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
  
  // 미디어 최대 볼륨 값 구하기
  val maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)
  
  // 미디어 볼륨 최대로 지정
  audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, maxVolume, 0)
}

 

코드 한 줄마다 주석을 작성했으니 읽어보면 이해하기 어렵지 않다.

 

마지막 줄의 setStreamVolume() 함수의 파라미터만 추가 설명을 하자면,

 

- Stream 타입

여러 타입의 소리 중, 변경할 소리를 선택한다.

예제에서는 미디어 볼륨을 선택했다. (STREAM_MUSIC)

 

- 볼륨 수치

최대 볼륨 값을 구해서 넣어주었다.

최대 볼륨 값을 로그로 찍어보면 15 라는 값이 나온다.

최저 볼륨도 다음과 같이 구할 수 있다.

AudioManager.getStreamMinVolume(AudioManager.STREAM_MUSIC) // == 0

 

- Flags

볼륨 변경 동작에 대한 부가적인 동작을 지정할 수 있다.

Ex)
AudioManager.FLAG_SHOW_UI : 볼륨 변경 완료 시, 화면에 볼륨 UI를 표시
AudioManager.FLAG_PLAY_SOUND : 볼륨 변경 완료 시, 변경된 볼륨으로 효과음 출력

 

0으로 지정하면 플래그를 지정하지 않고 동작한다.

 

 

 

 

 

 

✅ 결과

 

 

위 사진을 보다시피 볼륨을 모두 꺼놓은 상태에서 버튼을 누르면

 

 

최대 볼륨으로 변경된 것을 확인할 수 있다.

 

 

 

 

 

 

✅ 시스템 · 알림 · 벨소리 볼륨 변경

 

미디어 볼륨 뿐만 아니라, 나머지 볼륨도 변경해본다.

Stream 타입만 해당 소리에 맞게끔 변경하여 작성해주면 된다.

 

MainActivity.kt

button.setOnClickListener {
  audioManager.setStreamVolume(AudioManager.STREAM_SYSTEM, 12, 0)
  audioManager.setStreamVolume(AudioManager.STREAM_NOTIFICATION, 13, 0)
  audioManager.setStreamVolume(AudioManager.STREAM_RING, 14, 0)
  audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 15, 0)
}

 

코드 순서대로 시스템 · 알림 · 벨소리 · 미디어 이다.

 

 

 

🎈 결과

 

 

입력한 값대로(12, 13, 14, 15) 변경된 것을 확인할 수 있다.

 

 

 

 

 

 

✅ 활용 예시

 

필자는 앱 내 긴급 알림을 TTS 기능을 활용하여 만들었는데,

TTS를 출력할 때 볼륨 조절 기능을 덧붙여 적용했다.

 

간략한 시나리오는 다음과 같다.

 

1. 기존 설정된 기기 볼륨 저장

2. 기기 볼륨을 최대 수치로 변경

3. TTS 출력 (긴급 알림)

4. 기기 볼륨을 기존 설정된 볼륨으로 변경

 

 

MainActivity.kt

button.setOnClickListener {
  // AudioManager · 기존 볼륨 · 최대 볼륨 초기화
  val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
  val originalVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
  val maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)
  
  // 최대 볼륨 설정
  audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, maxVolume, 0)
  
  CoroutineScope(Dispatchers.IO).launch {
    /*
    TODO (TTS 실행)
    */
    
    // 2초 딜레이 후 기존 볼륨 설정
    delay(2000)
    audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, originalVolume, 0)
  }
}

 

기존 볼륨을 originalVolume 변수에 저장해 놓았다가

볼륨을 되돌릴 때 사용한 것 말고는 새롭게 추가된 별다른 내용은 없다.

 

TTS 출력 직후 볼륨을 되돌리면 최대 볼륨으로 출력되지 않기에

간단하게 코루틴을 사용하여 2초의 딜레이 후 볼륨을 되돌렸다.

 

 

 

 

 

 


 

 

 

 

 

앱에서 기기의 볼륨 조절이 필요하다면 해당 작업이 끝나거나 또는 앱 종료 시

다시 원래 볼륨으로 되돌려 놓는 것이 바람직하다.

 

평소 작은 소리로 사용하던 사람에게 최대 볼륨을 강제 적용시켜버리고 되돌려 놓지 않는다면,

그 앱은 사용자에게 좋지 않은 인상과 경험을 남겨줄 것이다.

 

 

 

 

 

728x90