5

Я использую TextureView для воспроизведения видео в ListView. Однако сам TextureView отлично работает, если я нажимаю кнопку «домой» и повторно запускаю приложение несколько раз, TextureView становится черным (хотя звук продолжает воспроизводиться). Если я снова выйду и снова вернусь, TextureView станет белым (или, может быть, прозрачным, так как белый цвет моего фона).TextureView, воспроизводящее видео, становится черным после onPause

Вот мой код:

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()' на андроид проектов, вместо этого использовать '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()

Смежные вопросы