5

我正在使用TextureView在ListView中播放視頻。但是,如果我按Home按鈕並重新輸入應用程序幾次,TextureView本身工作得很好,TextureView將變黑(儘管音頻會繼續播放)。如果我退出並再次進入,TextureView變成白色(或者可能是透明的,因爲白色是我背景的顏色)。在onPause之後TextureView播放視頻變黑

這裏是我的代碼:

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

執行你平常的事情不要做使用'e.printStackTrace();'在Android項目,而不是使用'Log.e( 「UNIQUE_TAG」,「錯誤做... 。「,e);'所以你可以通過[logcat]獲得有用的錯誤信息(http://developer.android.com/tools/help/logcat.html) – petey

+0

是否每次都調用onSurfaceTextureAvailable?如果您每次啓動媒體播放器,您在哪裏停止播放? – fadden

+0

希望你的評論是一個答案fadden,答案確實在onSurfaceTextureAvailable – Userrrrrrrrr

回答

1

問題是每次的表面,可以使一個新的媒體播放器。不太確定這是如何工作的,但這是問題所在。相反,我在這個聽衆之外創建了mediaplayer。

0

從我的研究中,textureView.getSurfaceTexture()返回null onResume()。我所做的是在onResume()中重新附加聽衆。

TextureView textureView; 

/*.... 
Usual stuff 
*/ 

public void onPause(){ 
    super.onPause(); 

    //... destroy or disable image producer 
} 

public void onResume(){ 
    super.onResume(); 

    textureView.setSurfaceTextureListener(/*another listener*/); 
} 

然後,在onSurfaceTextureAvailable()