안드로이드 MediaPlayer 이해하기
MediaPlayer는 안드로이드에서 오디오와 동영상을 재생하기 위해 사용되는 기본 API입니다. 객체만 생성한 상태에서는 재생할 대상이 없으므로 반드시 미디어 데이터 소스를 전달해야 합니다. 2024~2025년 기준에서도 MediaPlayer는 여전히 사용되지만, ExoPlayer 같은 대안이 많이 사용되는 추세입니다. 그러나 간단한 오디오 재생 또는 짧은 효과음 재생에서는 MediaPlayer가 가장 간단한 선택입니다.

1. MediaPlayer 객체 생성
MediaPlayer player = new MediaPlayer();
단순히 생성한 상태에서는 아무 작업도 할 수 없으며, 반드시 setDataSource()로 재생할 파일 또는 스트림을 전달해야 합니다.
2. DataSource 설정
MediaPlayer는 여러 형태의 데이터 소스를 지원합니다.
void setDataSource(String path)void setDataSource(Context context, Uri uri)void setDataSource(FileDescriptor fd, long offset, long length)
로컬 파일, 리소스, 외부 저장소, 원격 URL 스트림 등 다양한 방식으로 미디어를 열 수 있습니다. 이 과정에서 IOException, IllegalStateException 등이 발생할 수 있으므로 반드시 예외 처리가 필요합니다.
3. prepare / prepareAsync
DataSource를 지정해도 바로 재생할 수 있는 것은 아닙니다. 내부적으로 코덱 선택, 버퍼 준비 등 초기화 과정이 필요합니다.
prepare(): 동기 방식, 준비가 끝날 때까지 호출이 블록됨prepareAsync(): 비동기 방식,OnPreparedListener콜백에서 준비 완료 알림
player.setOnPreparedListener(mp -> mp.start());
player.prepareAsync();
4. create() 정적 메서드
조금 더 단순한 방법으로는 MediaPlayer.create()를 사용할 수 있습니다.
static MediaPlayer create(Context context, int resid)static MediaPlayer create(Context context, Uri uri)
리소스 기반 소리 파일(R.raw.*)은 자동으로 준비(prepare)가 완료된 상태로 생성되므로 바로 start() 호출이 가능합니다. 단, 대용량 파일에는 적합하지 않으며 간단한 효과음에 적합합니다.
5. 재생 관련 메서드
start(): 재생 시작pause(): 일시 정지stop(): 정지
start()는 즉시 리턴되므로 재생 중에도 UI 조작 등 다른 작업이 가능합니다.
반복 재생
player.setLooping(true);
게임 BGM이나 반복 효과음 재생에 적합합니다.
6. release()와 reset()
- release(): MediaPlayer 객체를 완전 해제, 이후 재사용 불가
- reset(): 초기 상태로 되돌리고 DataSource 다시 설정 가능
앱 종료 시, Activity 종료 시, 또는 플레이어가 더 이상 필요하지 않을 때 반드시 release()를 호출해야 메모리 누수나 리소스 점유를 방지할 수 있습니다.
7. 최신(Android 12~14)에서 주의할 점
- 안드로이드 13 이상에서는 외부 저장소 접근 권한(READ_MEDIA_AUDIO)이 필요
- HTTP 연결 시 cleartext 비허용 앱의 경우 재생 불가 → https 사용 권장
- 장기 재생, 스트리밍, 대용량 재생은 ExoPlayer 권장
8. 최신 예제 코드
기존 예제를 최신 구조로 새롭게 작성하면 다음과 같습니다.
// Kotlin 버전
val player = MediaPlayer().apply {
setDataSource(context, Uri.parse("https://example.com/audio.mp3"))
setOnPreparedListener { it.start() }
prepareAsync()
}
9. Activity 종료 시 정리
override fun onDestroy() {
super.onDestroy()
player?.release()
player = null
}
정리
MediaPlayer는 간단한 오디오 재생에서 여전히 유용하지만, DataSource → prepare → start 과정을 반드시 올바르게 처리해야 정상적으로 동작합니다. 짧은 효과음은 create() 방식이 간단하고, 외부 파일이나 스트리밍 재생은 직접 DataSource를 설정하는 방식이 적합합니다.
'IT·디지털 > IT 개발자 팁' 카테고리의 다른 글
| 스마트폰 디바이스별 해상도 정리 (2025년 기준) (4) | 2012.08.22 |
|---|---|
| DOS 배치 파일을 쉘 스크립트로 변환하기 (0) | 2011.10.14 |
| 안드로이드 화면 회전 방지 방법 (최신 버전 기준) (0) | 2011.02.16 |
| Tab Layout / TabHost / TabActivity (1) | 2011.01.27 |
| 추상클래스란 무엇인가: 개념부터 설계 철학까지 정리(2025년 업데이트) (0) | 2011.01.25 |