[Flutter] Android 음악 재생 방해 문제 해결기
문제 발생: "왜 내 앱 때문에 음악이 꺼져?"
Flutter로 개발한 앱에서 동영상을 재생하는 기능을 구현했는데, 예상치 못한 문제가 발생했습니다. 사용자가 스포티파이나 멜론 같은 음악 앱에서 음악을 듣고 있을 때, 우리 앱을 실행하면 음악이 완전히 꺼지거나 음량이 작아지는 현상이 발생한 것입니다.
iOS에서는 정상적으로 작동했지만, Android에서만 이 문제가 나타났습니다. 사용자 입장에서는 굉장히 불편한 경험이었죠.
문제의 원인 파악
문제의 근본 원인은 Android의 Audio Focus 시스템에 있었습니다.
Android에서는 여러 앱이 동시에 오디오를 재생할 때 충돌을 방지하기 위해 "오디오 포커스"라는 개념을 사용합니다. 한 앱이 오디오 포커스를 요청하면, 다른 앱의 오디오는 일시정지되거나 음량이 낮아집니다.
우리 앱에서 사용한 VideoPlayerController가 다음과 같이 설정되어 있었기 때문이었습니다:
VideoPlayerController.networkUrl(
Uri.parse(videoUrl),
videoPlayerOptions: VideoPlayerOptions(
allowBackgroundPlayback: true, // 🚨 이게 문제였다!
),
);
allowBackgroundPlayback: true 설정은 백그라운드에서도 비디오를 재생할 수 있게 해주지만, 동시에 오디오 포커스를 강제로 가져오는 부작용이 있었습니다.
해결 과정: 삽질과 깨달음의 연속
1차 시도: Flutter 레벨에서만 해결하려고 했던 실수
처음에는 단순히 Flutter 코드만 수정하면 될 것이라고 생각했습니다:
videoPlayerOptions: VideoPlayerOptions(
allowBackgroundPlayback: false,
mixWithOthers: true,
),
하지만 이것만으로는 완전히 해결되지 않았습니다. 여전히 음량이 작아지는 현상이 발생했어요.
2차 시도: 네이티브 코드 개입의 필요성 깨달음
Flutter는 결국 네이티브 플랫폼 위에서 동작하기 때문에, Android 네이티브 레벨에서의 오디오 포커스 제어가 필요하다는 것을 깨달았습니다.
MainActivity.kt에 MethodChannel을 구현했습니다:
class MainActivity: FlutterActivity() {
private val CHANNEL = "android_audio_focus"
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
.setMethodCallHandler { call, result ->
when (call.method) {
"forceNoAudioFocus" -> {
forceNoAudioFocus()
result.success("Audio focus prevention set")
}
else -> result.notImplemented()
}
}
}
private fun forceNoAudioFocus() {
// 오디오 포커스를 아예 요청하지 않음
println("🎵 Android: 강제 오디오 포커스 방지")
}
}
3차 시도: 권한과 매니페스트 설정
AndroidManifest.xml에 필요한 권한을 추가했습니다:
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
최종 해결책: 완전한 오디오 포커스 무시 전략
결국 **"오디오 포커스를 아예 요청하지 않는다"**는 전략으로 문제를 해결했습니다:
// Flutter 코드
videoPlayerOptions: VideoPlayerOptions(
allowBackgroundPlayback: false, // 백그라운드 재생 비활성화
mixWithOthers: true, // 다른 앱과 혼합 허용
),
// Android 네이티브 코드
private fun forceNoAudioFocus() {
// 의도적으로 오디오 포커스를 요청하지 않음
// 다른 앱의 음악이 계속 재생되도록 보장
}
해결 결과
- ✅ 다른 앱의 음악이 원음량 그대로 계속 재생됨
- ✅ 우리 앱의 동영상도 무음으로 정상 재생됨
- ✅ 사용자 경험 크게 개선
추후 개선 사항
SNS 화면 상에서는 비디오에 대한 소리가 나야하므로 이 부분에 따라서 추후 수정 예정입니다.
일단 임시방편으로 모든 비디오 소리를 막았습니다.
개발 환경: Flutter 3.x, Android API 21+, video_player 패키지