El video de TextureView que se reproduce se vuelve negro después de onPause

Estoy usando un TextureView para reproducir un video en un ListView. El TextureView funciona perfectamente, sin embargo, si presiono el botón de inicio y vuelve a ingresar la aplicación varias veces, TextureView se vuelve negro (aunque el audio continúa reproduciéndose). Si salgo y vuelvo a entrar de nuevo, el TextureView se vuelve blanco (o tal vez transparente, ya que el blanco es el color de mi fondo).

Aquí está mi código:

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(); } } }); 

El problema era crear un nuevo reproductor multimedia cada vez que la superficie estuviera disponible. No estoy muy seguro de cómo funcionó, pero este fue el problema. En su lugar, creo el reproductor multimedia fuera de este oyente.

De mi investigación, textureView.getSurfaceTexture() devuelve null onResume() . Lo que hice fue volver a conectar un oyente en onResume() .

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

Entonces, realice sus cosas usuales en onSurfaceTextureAvailable()

  • Cómo tomar la instantánea de RTSP streaming con LibVLC para Android
  • Android comparte SurfaceTexture entre dos procesos
  • Textura transparente semi-transparente no funciona
  • Android TextureView / Dibujo / Rendimiento de la pintura
  • ¿Cómo determino la orientación predeterminada de los marcos de previsualización de la cámara?
  • Android: reproduce el mismo video en varias vistas
  • Realice un ajuste de vídeo en un TextureView (Partes de él están fuera (no visibles)) con MediaPlayer
  • Cómo reducir la latencia en la decodificación de video / avc de MediaCodec
  • Android SDK - camera2 - Dibujar rectángulo sobre TextureView
  • Reproducción de un video después de que un video en TextureView de Android tenga problemas
  • ¿Cuándo está cerrado el "Consumer Side" de un TextureView?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.