Android 如何在ExoPlayer中连接媒体源的ArrayList

Android 如何在ExoPlayer中连接媒体源的ArrayList,android,kotlin,return-type,exoplayer2.x,Android,Kotlin,Return Type,Exoplayer2.x,我想知道如何使用ArrayList中的媒体资源在ExoPlayer中背靠背播放两首以上的歌曲 我可以使用连接MediaSource来背靠背播放两首歌曲,但我必须将它们作为单独的参数加载到此基金会。我不想为一整张歌曲列表这样做。我试图找到答案,但似乎有一些基本的误解,因为我似乎无法在其他问题或博客中复制其他人的努力(许多博客显示了简单的双媒体源播放列表,如ExoPlayer文档) 此代码用于上下文: private fun prepareExoPlayer(songs: ListSongs

我想知道如何使用ArrayList中的媒体资源在ExoPlayer中背靠背播放两首以上的歌曲

我可以使用
连接MediaSource
来背靠背播放两首歌曲,但我必须将它们作为单独的参数加载到此基金会。我不想为一整张歌曲列表这样做。我试图找到答案,但似乎有一些基本的误解,因为我似乎无法在其他问题或博客中复制其他人的努力(许多博客显示了简单的双媒体源播放列表,如ExoPlayer文档)

此代码用于上下文:

    private fun prepareExoPlayer(songs: ListSongs) {
        val uris = parseUris(songs)
        val mediaSource = buildMediaSource(uris)
        applyAudioAttributes()
        simpleExoPlayer!!.prepare(mediaSource, false, false)
    }
此代码是问题所在:

    private fun buildMediaSource(uris: ArrayList<Uri>): MediaSource {
        val userAgent = Util.getUserAgent(this, "MusicPlayer")
        val defaultMediaSource = DefaultDataSourceFactory(this, userAgent)
        val progressiveMediaSource = ProgressiveMediaSource.Factory(defaultMediaSource)
        val mediaSources = ArrayList<MediaSource>()

        for (uri in uris) {
            mediaSources.add(progressiveMediaSource.createMediaSource(uri))
        }

        return if (mediaSources.size == 1) {
            mediaSources[0]
        } else {
            val concatenatingMediaSource = ConcatenatingMediaSource()
            concatenatingMediaSource.addMediaSources(mediaSources)
//            ConcatenatingMediaSource(mediaSources[0], mediaSources[1])
        }
    }
private-fun-buildMediaSource(URI:ArrayList):MediaSource{
val userAgent=Util.getUserAgent(这是“MusicLayer”)
val defaultMediaSource=DefaultDataSourceFactory(此,userAgent)
val progressiveMediaSource=progressiveMediaSource.Factory(defaultMediaSource)
val mediaSources=ArrayList()
for(uri中的uri){
添加(progressiveMediaSource.createMediaSource(uri))
}
返回if(mediaSources.size==1){
媒体资源[0]
}否则{
val concatenatingMediaSource=concatenatingMediaSource()
连接MediaSource.addMediaSources(mediaSources)
//连接媒体源(媒体源[0],媒体源[1])
}
}

在else语句中,我得到一个失败,因为返回类型不是MediaSource,而是一个单元。但是,最后一行的注释代码可以正常工作。如何修改最后第2行和第3行以播放我的歌曲列表?

好的,我刚刚找到了这个视频:

事实证明,ExoPlayer的
prepare
不必将
MediaSource
作为参数,但也可以将
ConcatenatingMediaSource
作为参数。这些不相同,但都被
prepare
功能接受

还值得注意的是,
连接MediaSource
可以接收单个
MediaSource
。这意味着无需对
MediaSource
ArrayList
的大小进行
if
语句检查

因此,解决方案是将
buildMediaSource
的返回类型更改为
ConcatenatingMediaSource
,并删除if语句。像这样:

    private fun buildMediaSource(uris: ArrayList<Uri>): ConcatenatingMediaSource {
        val userAgent = Util.getUserAgent(this, "MusicPlayer")
        val defaultMediaSource = DefaultDataSourceFactory(this, userAgent)
        val progressiveMediaSource = ProgressiveMediaSource.Factory(defaultMediaSource)
        val mediaSources = ArrayList<MediaSource>()

        for (uri in uris) {
            mediaSources.add(progressiveMediaSource.createMediaSource(uri))
        }

        val concatenatingMediaSource = ConcatenatingMediaSource()
            concatenatingMediaSource.addMediaSources(mediaSources)

        return concatenatingMediaSource
    }
private-fun-buildMediaSource(URI:ArrayList):连接MediaSource{
val userAgent=Util.getUserAgent(这是“MusicLayer”)
val defaultMediaSource=DefaultDataSourceFactory(此,userAgent)
val progressiveMediaSource=progressiveMediaSource.Factory(defaultMediaSource)
val mediaSources=ArrayList()
for(uri中的uri){
添加(progressiveMediaSource.createMediaSource(uri))
}
val concatenatingMediaSource=concatenatingMediaSource()
连接MediaSource.addMediaSources(mediaSources)
返回连接MediaSource
}