5

Ich verwende eine TextureView, um ein Video in einem ListView abzuspielen. Der TextureView selbst funktioniert einwandfrei, wenn ich jedoch die Home-Taste drücke und die Anwendung einige Male erneut eingebe, wird die TextureView schwarz (obwohl das Audio weiter abgespielt wird). Wenn ich das Fenster schließe und wieder einschließe, wird die Texturansicht weiß (oder vielleicht transparent, da Weiß die Farbe meines Hintergrunds ist).TextureView Video wird schwarz nach onPause

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

Gebrauch nicht tun 'e.printStackTrace();' auf Android-Projekte, stattdessen 'Log.e ("UNIQUE_TAG",„Fehler zu tun ... . ", e);' So können Sie hilfreiche Fehlerinformationen über [logcat] (http://developer.android.com/tools/help/logcat.html) erhalten. – petey

+0

Wird onSurfaceTextureAvailable jedes Mal aufgerufen? Wenn Sie den Media Player jedes Mal starten, wo stoppen Sie ihn? – fadden

+0

Ich wünschte, dein Kommentar wäre eine Antwort fadden, die Antwort war in der Tat in onSurfaceTextureAvailable – Userrrrrrrrr

Antwort

1

Problem bildet einen neuen Mediaplayer jedes Mal, wenn die Oberfläche zur Verfügung steht. Nicht ganz sicher, wie das funktionierte, aber das war das Problem. Stattdessen erstelle ich den Mediaplayer außerhalb dieses Hörers.

0

Aus meiner Forschung textureView.getSurfaceTexture() gibt Null onResume() zurück. Was ich getan habe, war ein Hörer wieder an sie 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*/); 
} 

Dann führen Sie Ihre üblichen Dinge auf onSurfaceTextureAvailable()