Android VideoView在stopPlayback()后清除显示

我正在使用VideoView组件来播放video。 手动调用stopPlayback()后,我似乎无法清除VideoView显示。 我想重置VideoView,以便原始背景可见。

  1. 在VideoView组件中播放video。
  2. select一个新的video播放。
  3. VideoView卡在第一个video的最后一帧,直到下一个video开始。 如果下一个video出现错误,则来自第一个video的静态图片仍然会停留在此处。
  4. 如果我让video播放到完成状态,显示被清除。

我正在使用的代码:

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(); } } 

请注意,基于VideoView.java源,stopPlayback()在底层MediaPlayer上执行以下操作:

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

Solutions Collecting From Web of "Android VideoView在stopPlayback()后清除显示"

对我而言,只需隐藏然后使用setVisibility显示VideoView

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

这是因为我想让VideoView变得透明,而不是一个纯色。 将背景设置为透明不起作用 – video帧仍然显示。

除非有人可以提供更好的解决scheme,否则我所解决的解决scheme是使用setBackgroundResource ,由于它似乎改变了前景资源,所以似乎很奇怪。

 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); } } 

我引用的drawable是一个带有自定义蓝色背景和居中徽标图像的简单layer-list

绘制\ 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> 

或者,我也可以使用setZOrderOnTop来控制放置表面视图的位置(您也可以在VideoViewer的顶部定义另一个视图并以这种方式切换视图):

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

或者,我也可以使用setBackgoundColor来完成setBackgoundColor同样的事情:

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

那么,对于我来说,这个线程的解决scheme没有任何工作,所以我尝试了其他的东西,下面是为我工作的解决scheme,

 new Handler().postDelayed(new Runnable() { @Override public void run() { mVideoViewPlayList.setVisibility(View.GONE); mVideoViewPlayList.setVisibility(View.VISIBLE); mVideoViewPlayList.setVideoURI(Uri.parse(path)); } }, 500); 

只是这个代码:

 videoView.setVideoURI(null);