5

Używam TextureView do odtworzenia wideo w widoku listy. Sam widok TextureView działa doskonale, jeśli jednak naciśnie się przycisk home i ponownie kilka razy uruchomię aplikację, tekstura zmieni kolor na czarny (chociaż dźwięk będzie nadal odtwarzany). Jeśli wyjdę i ponownie wprowadzę ponownie, TextureView stanie się biały (lub może przezroczysty, ponieważ biały jest kolorem mojego tła).Odtwarzanie wideo TextureView zmienia kolor na czarny po onPause

Oto mój kod:

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

nie używaj nie 'w.printStackTrace();' na Android projektów, zamiast użyć 'Log.e ("UNIQUE_TAG",„błąd robi ... . ", e);' dzięki czemu można uzyskać pomocne informacje o błędach za pomocą [logcat] (http://developer.android.com/tools/help/logcat.html) – petey

+0

Czy funkcja onSurfaceTextureAvailable jest wywoływana za każdym razem? Jeśli za każdym razem uruchamiasz odtwarzacz multimedialny, gdzie go zatrzymujesz? – fadden

+0

Życzenie komentarza było odpowiedzią, odpowiedź była w rzeczywistości na stronie – Userrrrrrrrr

Odpowiedz

1

Problem robił nową MEDIAPLAYER każdym razem, gdy powierzchnia jest dostępna. Nie do końca wiem, jak to działało, ale to był problem. Zamiast tego tworzę mediaplayer poza tym słuchaczem.

0

Z moich badań wynika, że ​​textureView.getSurfaceTexture() zwraca wartość null onResume(). To, co zrobiłem, to ponowne dołączenie do niego słuchacza w onResume().

TextureView textureView; 

/*.... 
Usual stuff 
*/ 

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

    //... destroy or disable image producer 
} 

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

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

Następnie wykonywać swoje zwykłe rzeczy na onSurfaceTextureAvailable()