Android - MediaPlayer 가 정상작동 하지 않을 때

Updated:

회사에서 작업을 하는 와중에 MediaPlayer 로 소리를 재생하는 과정에서

MediaPlayer.create(context, R.raw.sound).also{
		it.start()
		it.setOnCompletionListener{mp ->
			mp.stop()
			mp.release()
			//working Logic
		}
}

와 같은 코드에서

setOnCompletionListener() 이 정상적으로 작동하지 않는 경우(제대로 불리지 않는 경우가 다수 발생 , log 로 확인)가 발생하여

상당히 애를 먹었다…… 아주 많이…..

coroutine 문제인가 » scope 변경도 해보고…..

혹은 MeidaPlayer 문제 인가 정확하게 파악이 안되어서 다양한 시도를 해봤고,,,, » 다 부수고 새로만들어보고

주변의 추천으로 exoplayer2 도 사용했지만 역시나 소리가 제대로 나지 않았다…… (덕분에 background 재생 방법을 알게됨)

그에 대한 해결책은 전역변수 선언

원인은 로컬로 사용하는 MediaPlayer 로 GC(Garbage Collector) 가 자동으로 수집하게 되어

제대로 정상 종료 되지 못하고 이상하게 종료되는 현상이 발생한 것이다..

//전역변수 선언 
private latient var soundPlayer : MediaPlayer

...

fun soundOn(){
  soundPlayer = MediaPlayer.create(context, R.raw.sound).also{
    it.start()
    it.setOnCompletionListener{mp->
       mp.stop()
       mp.release()
       //working Logic      
    }
  }
}

해당과 같이 선언을 먼저 해주고 추후에 사용시에 create 를 하게 되면

GC 가 작동하지 않고 file 이 정상적으로 작동하고 setOnCompletionListener가 정상적으로 호출된다.

끝!

버그 파악은 어렵지만 생각보다 간단하게 해결되는 경우가 많은 참 재미있는 코딩세계…….