首页 > 解决方案 > 与 ViewPager 一起使用时,如何在 Exoplayer 中播放或暂停视频?

问题描述

我正在尝试在ViewPager中使用Exoplayer。只有当我通过单击用于显示视频的缩略图打开它时,它才会播放。但是当我通过滚动到达页面时它不会播放。

我尝试使用 Lambda在onPageSelected()和VPAdapter的onScrolled()seekTo(0, 0)方法中调用& ,但没有成功。playWhenReady = trueplayWhenReady = false

这是我用于 viewPager 的适配器。

class MediaVPAdapter(
    val context: Context,
    @LayoutRes val layoutRes: Int,
    val medias: List<MediaFiles> = listOf()
) : PagerAdapter() {

    private var player: SimpleExoPlayer? = null

    override fun isViewFromObject(view: View, o: Any): Boolean {
        return view == o
    }

    override fun getCount() = medias.size

    override fun instantiateItem(container: ViewGroup, position: Int): Any {
        return LayoutInflater.from(context).inflate(layoutRes, container, false).apply {
            if (medias.isNotEmpty()) {
                when (medias[position].mediaType) {
                    MediaType.PHOTO -> {
                        // Display the Image
                    }
                    MediaType.VIDEO -> {

                        ssImageView.makeInvisible(true)
                        exoPlayerView.makeVisible()
                        player = ExoPlayerFactory.newSimpleInstance(
                            DefaultRenderersFactory(context),
                            DefaultTrackSelector(),
                            DefaultLoadControl()
                        )
                        if (medias[position].uri != null)
                            initPlayer(this, medias[position].uri!!)

                    }
                    null -> {

                    }
                }
            }

            container.addView(this, 0)
        }
    }

    private fun initPlayer(view: View, uri: Uri) {
        Timber.i("initPlayer: uri: $uri")
        with(view) {
            player!!.let {
                exoPlayerView.player = it

                it.prepare(buildMediaSource(uri), true, false)

                it.playWhenReady = false
            }
        }
    }

    private fun buildMediaSource(uri: Uri) = ExtractorMediaSource.Factory(
        DefaultDataSourceFactory(context, Util.getUserAgent(context, context.getString(R.string.app_name)))
    )
        .setExtractorsFactory(DefaultExtractorsFactory())
        .createMediaSource(uri)


    override fun destroyItem(container: ViewGroup, position: Int, obj: Any) {
        releasePlayer()
    }

    private fun releasePlayer() {
        if (player != null) {
            playWhenReady = false
            player!!.release()
            player = null
        }
    }
}

val mediaAdapter = MediaVPAdapter(
            this,
            R.layout.fragment_media,
            true,
            medias?.toList() ?: listOf()
        )
        vpMedia.adapter = mediaAdapter
        vpMedia.currentItem = position ?: 0
        vpMedia.offscreenPageLimit = 1

如果我单击视频,则可以播放所选视频,但是当我滚动到其他项目时,它们都没有播放。当我尝试切换播放/暂停按钮时,只有按钮在切换。

标签: androidandroid-viewpagerexoplayer

解决方案


据我所知,您的代码错过了setPlayWhenReady侦听器。您应该通过添加initPlayer方法it.setPlayWhenReady(playWhenReady)来修复它。


推荐阅读