最近在做一個播放器,需要實現一個從小屏切換到全屏的效果,我用的是TextureView + MediaPlayer 的方式去實現,當需要切換成全屏時,我在 TextureView 的 onSurfaceTextureDestroyed 方法中將MediaPlayer的 setSurface 方法置成了NULL,然后打算在屏幕切換完成后,即在 onSurfaceTextureAvailable 方法中重新給MediaPlayer設置一個Surface, 但是這樣卻帶來一個問題:
每次打印完 E/BufferQueueProducer: [SurfaceTexture-0-25503-6] cancelBuffer: BufferQueue has been abandoned 后播放器都會dump掉,然后就報了一個錯誤:E/MediaPlayer: error(1, -19), 最開始我懷疑是Player在Playing狀態下不能設置setSurface為NULL,后來實際嘗試了下,是可以這么做的,百思不解的情況下求教了一下萬能的Google, 結果在這篇博客中找到了答案:
https://blog.csdn.net/YoungHong1992/article/details/84324965
結合了下自己遇到的問題,大概明白了問題所在:當我的SurfaceTexture所關聯的View從屏幕中remove掉了之后,這個SurfaceTexture也被回收掉了,所以只需要保證這個SurfaceTexture不被回收掉就行,按照這篇博客的內容,將SurfaceTexture提升為成員變量,問題解決。
一個相關聯的StackOverflow: https://stackoverflow.com/questions/23807086/surfacetexture-has-been-abandoned