MediaPlayer: BufferQueue has been abandoned 解決方案

最近在作一個播放器,須要實現一個從小屏切換到全屏的效果,我用的是TextureView + MediaPlayer 的方式去實現,當須要切換成全屏時,我在 TextureView 的 onSurfaceTextureDestroyed 方法中將MediaPlayer的 setSurface 方法置成了NULL,而後打算在屏幕切換完成後,即在 onSurfaceTextureAvailable 方法中從新給MediaPlayer設置一個Surface, 可是這樣卻帶來一個問題:spa

每次打印完 E/BufferQueueProducer: [SurfaceTexture-0-25503-6] cancelBuffer: BufferQueue has been abandoned 後播放器都會dump掉,而後就報了一個錯誤:E/MediaPlayer: error(1, -19), 最開始我懷疑是Player在Playing狀態下不能設置setSurface爲NULL,後來實際嘗試了下,是能夠這麼作的,百思不解的狀況下求教了一下萬能的Google, 結果在這篇博客中找到了答案:.net

https://blog.csdn.net/YoungHong1992/article/details/84324965code

結合了下本身遇到的問題,大概明白了問題所在:當個人SurfaceTexture所關聯的View從屏幕中remove掉了以後,這個SurfaceTexture也被回收掉了,因此只須要保證這個SurfaceTexture不被回收掉就行,按照這篇博客的內容,將SurfaceTexture提高爲成員變量,問題解決。blog

一個相關聯的StackOverflow: https://stackoverflow.com/questions/23807086/surfacetexture-has-been-abandonedrem