我也遇到过这个问题,这是我的解决方案
Declaration
private val exoPlayer: SimpleExoPlayer by lazy { SimpleExoPlayer.Builder(this).build()}
播放歌曲
private fun prepareExoPlayerFromURL(url: String) {
val dataSourceFactory =
DefaultDataSourceFactory(this, Util.getUserAgent(this, resources.getString(R.string.app_name)), null)
val extractorsFactory = DefaultExtractorsFactory()
// val audioSource = ExtractorMediaSource(uri, dataSourceFactory, extractorsFactory, null, null)
val concateMediaSource = ConcatenatingMediaSource()
// to play from song list
for (i in mSongList) { // song list song arraylist
val mediaSource = ProgressiveMediaSource
.Factory(
DefaultDataSourceFactory(this, dataSourceFactory),
DefaultExtractorsFactory()
)
.createMediaSource(Uri.parse(i.musicFile)/*Uri.parse(i.uri)*/)
concateMediaSource.addMediaSource(mediaSource)
}
// to play single song
/* val audioSource = ProgressiveMediaSource
.Factory(
DefaultDataSourceFactory(this, dataSourceFactory),
DefaultExtractorsFactory()
)
.createMediaSource(Uri.parse(url))*/
exoPlayer.prepare(concateMediaSource/*audioSource*/)
exoPlayer.seekToDefaultPosition(songPosition)
exoPlayer.playWhenReady = true
setNotification()
}
设置播放器的监听器和通知
private fun setListoner() {
exoPlayer.addListener(object : Player.EventListener {
override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
when (playbackState) {
Player.STATE_BUFFERING -> Log.e(TAG,"STATE_BUFFERING")
Player.STATE_ENDED -> Log.e(TAG,"STATE_ENDED")
Player.STATE_IDLE -> Log.e(TAG,"STATE_IDLE")
Player.STATE_READY ->{
if (playWhenReady) {
Log.e(TAG, "PlaybackStatus.PLAYING")
} else {
Log.e(TAG, "PlaybackStatus.PAUSED")
}
}
else -> Log.e(TAG,"PlaybackStatus.IDLE")
}
}
})
}
杀死玩家
private fun onDestroy() {
if (exoPlayer != null) {
exoPlayer.release()
exoPlayer = null
mediaSource = null
}
}
更多详情可以查看official documentation
Universal Music Player 使用 ExoPlayer 进行本地音频播放。
Building feature-rich media apps with ExoPlayer (Google I/O '18)