课程学院-视频播放
最近抽空把沙滩app的课程学院部分给做了一下,效果么,照着网站上的来(其实是不会设计) 

 照着文档,建好bean类和获取方法,完成了数据的获取。 看了下播放器,是阿里云的,又照着那边的文档,导入sdk,初始化播放器设置,把之前获取的播放地址,凭证导入,?,可以播放了
 照着文档,建好bean类和获取方法,完成了数据的获取。 看了下播放器,是阿里云的,又照着那边的文档,导入sdk,初始化播放器设置,把之前获取的播放地址,凭证导入,?,可以播放了
折腾播放控件
好了,既然可以播放了,那就开始写播放器的控制按键,布局简单的借鉴了下bilibili 
 有播放/暂停/重播,进度条,时间,全屏,返回(全屏时返回初始的样子) 因为之前学习过视频播放的小demo,所以就打算仍然把播放、控制都放进了viewModel,添加进lifecycle进行观察 本来打算写个MyMediaPlayer继承AliPlayer,LifecycleObserver,发现AliPlayer是个接口(想想就算了,haha),就直接把写的PlayerViewModel直接继承一下,丢进lifecycle了
 有播放/暂停/重播,进度条,时间,全屏,返回(全屏时返回初始的样子) 因为之前学习过视频播放的小demo,所以就打算仍然把播放、控制都放进了viewModel,添加进lifecycle进行观察 本来打算写个MyMediaPlayer继承AliPlayer,LifecycleObserver,发现AliPlayer是个接口(想想就算了,haha),就直接把写的PlayerViewModel直接继承一下,丢进lifecycle了
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun pausePlayer() { 
    aliPlayer.pause()
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun resumePlayer() { 
    aliPlayer.start()
}
lifecycle.addObserver(playerViewModel)
然后处理一下播放控件的功能 1. 整个控件页面的显示与隐藏
    /**
     * 控制播放控件的显示于隐藏
     */
    fun toggleControllerVisibility() {
        if (_controllerFrameVisibility.value == View.INVISIBLE) {
            _controllerFrameVisibility.value = View.VISIBLE
            controllerShowTime = System.currentTimeMillis()
            viewModelScope.launch {
                delay(3000)
                if (System.currentTimeMillis() - controllerShowTime >= 3000) {
                    _controllerFrameVisibility.value = View.INVISIBLE
                } else {
                    Log.d("myLog", "delay时间未超过3秒")//测试时使用
                }
            }
        } else {
            _controllerFrameVisibility.value = View.INVISIBLE
        }
    }
- 播放按钮的图标显示和功能(后续把点击屏幕的播放暂停补上)
    /**
     * 控制播放按钮的图标显示
     */
    fun togglePlayerStatus() {
        when (_playerStatus.value) {
            PlayerStatus.Playing -> {
                aliPlayer.pause()
                _playerStatus.value = PlayerStatus.Paused
            }
            PlayerStatus.Paused -> {
                aliPlayer.start()
                _playerStatus.value = PlayerStatus.Playing
            }
            PlayerStatus.Completed -> {
                aliPlayer.start()
                _playerStatus.value = PlayerStatus.Playing
            }
            else -> {
                return
            }
        }
    }
- 进度条和时间的实时更新
private fun updatePlayerProgress() {
        lifecycleScope.launch {
            while (true) {
                delay(1000)
                val currentPosition = playerViewModel.currentPositionValue.value
                binding.controllerFrame.seekBar.progress = currentPosition?.toInt() ?: 0
            }
        }
    }
- 返回键的功能区分 一开始没注意,全屏直接返回了上一个界面,然后也没做强制竖屏啥的hahaha
binding.controllerFrame.videoBack.setOnClickListener {
            if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {
                requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
            } else {
                //返回,若视频在播放中,则暂停播放
                playerViewModel.aliPlayer.stop()
                finish()
            }
        }
- 全屏按钮(遇到些问题/(ㄒoㄒ)/~~)
binding.controllerFrame.fullScreen.setOnClickListener {
            //点击后全屏(暂时可用)
            //Log.d("myLog", "点击了全屏")
            //设置屏幕的orientation
            requestedOrientation =
                if (resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) {
                    ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
                } else {
                    ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
                }
        }
override fun onWindowFocusChanged(hasFocus: Boolean) {
        super.onWindowFocusChanged(hasFocus)
        if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            hideSystemUI()
            playerViewModel.emmitVideoResolution()
        }
    }
很遗憾,这边出了问题,我发现不知道为啥,全屏之后整改生命周期重新开始了,之前做的demo就没有这样(也可能是我没发现。。),然后全屏是做到了,但是视频直接重新加载了,不得已在viewModel中加了个hasGetVideo去保证视频不重新加载。。 另外我试过在manifest中加上android:configChanges="orientation|screenSize|keyboardHidden",但是发现hideSystemUI()失效了。。导航栏状态栏没隐藏,emmmmm。。。。后面有时间了在研究研究
总结
总的来说,基本的视频播放还是挺好弄的,难弄的是一些播放控件以及复杂一些的功能,目前够用就行,想要弄些复杂的功能,之后再弄。 不知道小伙伴们都是怎么处理播放部分的,是用别人的轮子,还是向我一样,自己简单写个hahaha。




 阿肥  回复 @A lonely cat
 阿肥  回复 @A lonely cat 


















