Text playback in TextureView playback mode turns black after onPause

I am using TextureView to play videos in a ListView. However, TextureView itself works great if I press the home button and restart the application several times, TextureView turns black (although the sound continues to play). If I go out again and come back again, the TextureView will turn white (or possibly transparent, since my background is white).

Here is my code:

holder.instagramTextureView .setSurfaceTextureListener(new SurfaceTextureListener() { @Override public void onSurfaceTextureUpdated( SurfaceTexture surface) { // TODO Auto-generated method stub } @Override public void onSurfaceTextureSizeChanged( SurfaceTexture surface, int width, int height) { // TODO Auto-generated method stub } @Override public boolean onSurfaceTextureDestroyed( SurfaceTexture surface) { // TODO Auto-generated method stub return false; } @Override public void onSurfaceTextureAvailable( SurfaceTexture surface, int width, int height) { final Surface s = new Surface(surface); try { holder.mMediaPlayer = new MediaPlayer(); holder.mMediaPlayer.setDataSource(post .getMedias().get(0) .getMediaUrlVideomp4StandardRes()); holder.mMediaPlayer.setSurface(s); holder.mMediaPlayer.prepare(); holder.instagramVideoVolume = 0f; holder.mMediaPlayer.setVolume( holder.instagramVideoVolume, holder.instagramVideoVolume); //holder.mMediaPlayer.setOnBufferingUpdateListener(this); holder.mMediaPlayer .setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion( MediaPlayer mp) { // To play: mp.reset(); try { mp.setDataSource(post .getMedias() .get(0) .getMediaUrlVideomp4StandardRes()); mp.prepare(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch // block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch // block e.printStackTrace(); } catch (IllegalStateException e) { // TODO Auto-generated catch // block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch // block e.printStackTrace(); } // <--- Here comes a call to // "To Resize" which is shown // right above this code mp.start(); } }); // holder.mMediaPlayer.setOnPreparedListener(this); //holder.mMediaPlayer.setOnVideoSizeChangedListener(this); holder.mMediaPlayer .setAudioStreamType(AudioManager.STREAM_MUSIC); holder.mMediaPlayer.start(); holder.instagramTextureView .setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (holder.instagramVideoVolume == 1) { holder.instagramVideoVolume = 0f; holder.mMediaPlayer .setVolume( holder.instagramVideoVolume, holder.instagramVideoVolume); } else { holder.instagramVideoVolume = 1f; holder.mMediaPlayer .setVolume( holder.instagramVideoVolume, holder.instagramVideoVolume); } } }); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); 
+5
source share
2 answers

The problem was creating a new media player every time the surface is accessible. Not quite sure how this worked, but it was a problem. Instead, I create a media player outside of this listener.

+1
source

From my research, textureView.getSurfaceTexture() returns null onResume() . I did a reload of the listener in onResume() .

 TextureView textureView; /*.... Usual stuff */ public void onPause(){ super.onPause(); //... destroy or disable image producer } public void onResume(){ super.onResume(); textureView.setSurfaceTextureListener(/*another listener*/); } 

Then follow the usual steps on onSurfaceTextureAvailable()

0
source

All Articles