EspoirX / StarrySky

🔥A Powerful and Streamline MusicLibrary(一个丰富的音乐播放封装库,支持多种音频格式,完美解决你的问题。)
https://github.com/EspoirX/StarrySky
MIT License
1.39k stars 209 forks source link

播放回调状态不对 #176

Closed jp0533 closed 3 years ago

jp0533 commented 3 years ago

你好,我在使用StarrySky框架加载本地文件的时候使用了拦截器对本地文件进行处理,然后在播放处理后的文件时出现播放正常但StarrySky框架回调不对导致页面未刷新的情况,我的代码如下:

  1. 拦截器处理本地文件: ` class MyInfoInterceptor() : StarrySkyInterceptor {

    override fun process( songInfo: SongInfo?, mainLooper: MainLooper, callback: InterceptorCallback ) { log { "MusicPlayerDetailActivity --> 处理前的音频文件路径: ${songInfo?.songUrl}" } // 此处对文件进行处理,操作是下载网络文件,具体过程代码忽略,完成后将本地文件路径赋值给SongInfo val filePath = "" log { "MusicPlayerDetailActivity --> 处理后的音频文件路径: ${filePath}" } songInfo?.apply { songUrl = filePath } log { "MusicPlayerDetailActivity --> 文件已下载 ${songInfo?.toJson()}" } callback.onContinue(songInfo) } } `

  2. 在ExoPlayback回调中断点调试 ` private inner class ExoPlayerEventListener : Player.EventListener { ... // 未处理的回调 override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) { when (playbackState) { Player.STATE_IDLE, Player.STATE_BUFFERING, Player.STATE_READY -> mCallback?.onPlaybackStatusChanged(currPlayInfo, playbackState) Player.STATE_ENDED -> mCallback?.onPlaybackCompletion() } if (playbackState == Player.STATE_READY) { sourceTypeErrorInfo.clear() } }

    override fun onPlayerError(error: ExoPlaybackException) {
        val what: String = when (error.type) {
            ExoPlaybackException.TYPE_SOURCE -> error.sourceException.message.toString()
            ExoPlaybackException.TYPE_RENDERER -> error.rendererException.message.toString()
            ExoPlaybackException.TYPE_UNEXPECTED -> error.unexpectedException.message.toString()
            else -> "Unknown: $error"
        }
        mCallback?.onPlaybackError(currPlayInfo, "ExoPlayer error $what")
        if (error.type == ExoPlaybackException.TYPE_SOURCE) {
            sourceTypeErrorInfo.happenSourceError = true
            sourceTypeErrorInfo.seekToPositionWhenError = sourceTypeErrorInfo.seekToPosition
            sourceTypeErrorInfo.currPositionWhenError = currentStreamPosition
        }
    }
    
    ... // 未处理的回调

    } 其中onPlayerStateChanged回调中我看框架代码并没有区别处理,而ExoPlayer中的说明如下: /**

    • The player is able to immediately play from its current position. The player will be playing if
    • {@link #getPlayWhenReady()} is true, and paused otherwise. */ int STATE_READY = 3; ` 此处应该是如果playbackState为3时要区分playWhenReady,如果playWhenReady为true时应该会立即播放,playWhenReady为false的话播放器应该会暂停, 然后我追踪代码到PlaybackManager类中第110行updatePlaybackState方法,此处因为对框架代码不熟悉,有点看不懂调用关系,我看框架没有提供自定义IPlaybackManager的功能,不知道这里如果要调试修改的话应该怎么处理,或者这里框架内部已经处理了上述的不同情况。 如方便的话可否指点下应该怎么修改代码,或者框架的处理逻辑是对的,我哪里没有配置对么?盼回复,谢谢。 PS:使用的框架版本号是2.4.4
EspoirX commented 3 years ago

好,不久后会更新一个版本,到时候通知

EspoirX commented 3 years ago

请用2.4.5版本,有问题欢迎进行反馈