web-dev-qa-db-fra.com

Affichage clair Android VideoView après stopPlayback ()

J'utilise un composant VideoView pour lire des vidéos. Je n'arrive pas à effacer l'affichage VideoView après avoir appelé manuellement stopPlayback (). Je souhaite réinitialiser VideoView afin que l'arrière-plan d'origine soit visible.

  1. Lire une vidéo dans un composant VideoView.
  2. Sélectionnez une nouvelle vidéo à lire.
  3. VideoView reste bloqué sur la dernière image de la première vidéo jusqu'au début de la vidéo suivante. S'il y a une erreur avec la vidéo suivante, l'image statique de la première vidéo reste bloquée là.
  4. Si je laisse la vidéo jouer jusqu'à son achèvement, l'affichage est effacé.

Le code que j'utilise:

private VideoView videoViewer = null;

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
  if (videoViewer != null) {
    videoViewer.setOnPreparedListener(new OnPreparedListener());
  }
...
}

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  if (videoViewer != null) {
    videoViewer.stopPlayback();
    videoViewer.setVideoURI(Uri.parse("http://my_vido_url/playlist.m3u8"));
  }
}

private class OnPreparedListener implements MediaPlayer.OnPreparedListener {
  @Override
  public void onPrepared(MediaPlayer mp) {
    videoViewer.start();
  }
}

Notez que sur la source VideoView.Java, stopPlayback () effectue l'action suivante sur le MediaPlayer sous-jacent:

public void stopPlayback() {
  if (mMediaPlayer != null) {
    mMediaPlayer.stop();
    mMediaPlayer.release();
    mMediaPlayer = null;
  }
}
24
DanielB6

Pour moi, ce qui a bien fonctionné a été de masquer puis d'afficher la VideoView en utilisant setVisibility .

public void clearCurrentFrame() {
    videoView.setVisibility(GONE);
    videoView.setVisibility(VISIBLE);
}

C'est parce que je voulais que la VideoView devienne transparente et non une couleur unie. La définition de l'arrière-plan sur transparent ne fonctionne pas - l'image vidéo est toujours affichée.

16
William

La solution que j'ai choisie, à moins que quelqu'un ne puisse en proposer un meilleur, consiste à utiliser setBackgroundResource, qui semble étrangement nommé puisqu'il semble modifier la ressource de premier plan.

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
  videoViewer.setBackgroundResource(R.drawable.viewer_background);
...
}

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  if (videoViewer != null) {
    videoViewer.stopPlayback();
    // Set the background back to the drawable resource to clear the current video when switching to a new one.
    videoViewer.setBackgroundResource(R.drawable.viewer_background);
    videoViewer.setVideoURI(Uri.parse("http://my_vido_url/playlist.m3u8"));
  }
}

private class OnPreparedListener implements MediaPlayer.OnPreparedListener {
  @Override
  public void onPrepared(MediaPlayer mp) {
    videoViewer.start();
    // Clear the background resource when the video is prepared to play.
    videoViewer.setBackgroundResource(0);
  }
}

Le dessin que je référence est un simple layer-list avec un arrière-plan bleu personnalisé et une image de logo centrée.

drawable\viewer_background.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android" >
  <item>
    <shape Android:shape="rectangle">
      <solid Android:color="@color/custom_blue" />
    </shape>
  </item>
  <item>
    <bitmap Android:src="@drawable/img_logo"
      Android:gravity="center" />
  </item>
</layer-list>

Sinon, j'ai également pu utiliser setZOrderOnTop pour contrôler l'emplacement de la vue de surface (vous pouvez également définir une autre vue au-dessus de VideoViewer et basculer la visibilité de cette façon):

videoViewer.setZOrderOnTop(false);
videoViewer.setZOrderOnTop(true);

Sinon, je pourrais aussi utiliser setBackgoundColor pour accomplir la même chose que setBackgroundResource:

videoViewer.setBackgroundColor(getResources().getColor(R.color.custom_blue));
videoViewer.setBackgroundColor(Color.TRANSPARENT);
10
DanielB6

juste ce code:

videoView.setVideoURI(null);
2
mojtaba

Eh bien, pour moi, aucune des solutions de ce fil n'a fonctionné, alors j'ai essayé autre chose et voici la solution qui fonctionne pour moi

new Handler().postDelayed(new Runnable() {

     @Override
     public void run() {
        mVideoViewPlayList.setVisibility(View.GONE);
        mVideoViewPlayList.setVisibility(View.VISIBLE);
        mVideoViewPlayList.setVideoURI(Uri.parse(path));
    }
}, 500);
1
Lalit Poptani

Vous pouvez faire comme ça;

videoView.stopPlayBack();   
 videoView.seekTo(0);  

espérons que cela peut vous aider

0
xiaobenbentian