5

Sto usando un TextureView per riprodurre un video in un ListView. Lo stesso TextureView funziona perfettamente, tuttavia, se premo il tasto home e torno di nuovo all'applicazione alcune volte, TextureView diventa nero (anche se l'audio continua a essere riprodotto). Se esco e torno nuovamente, TextureView diventa bianco (o forse trasparente, poiché il bianco è il colore del mio sfondo).TextureView riproduzione video diventa nero dopo onPause

Ecco il mio codice:

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

dont use non 'e.printStackTrace();' su progetti Android, invece usare 'Log.e ("UNIQUE_TAG", "Errore di fare ... . ", e);' così puoi ottenere utili informazioni di errore tramite [logcat] (http://developer.android.com/tools/help/logcat.html) – petey

+0

OnSurfaceTextureAvailable viene chiamato ogni volta? Se stai avviando il lettore multimediale ogni volta, dove lo fermi? – fadden

+0

Vorrei che il tuo commento fosse una risposta fadden, la risposta era davvero in onSurfaceTextureDisponibile – Userrrrrrrrr

risposta

1

problema stava facendo un nuovo mediaplayer ogni volta che la superficie è disponibile. Non sapevo bene come funzionasse, ma questo era il problema. Invece, creo il mediaplayer al di fuori di questo ascoltatore.

0

Dalla mia ricerca, textureView.getSurfaceTexture() restituisce null onResume(). Quello che ho fatto è stato ricollegare un ascoltatore ad esso 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*/); 
} 

Quindi, eseguire le vostre solite cose sulla onSurfaceTextureAvailable()