如何在播放前在videoview中设置预览图像

我在我的活动中创build了一个VideoView ,下面是代码。

 VideoView vvVideos = (VideoView) rootView.findViewById(R.id.videoView); MediaController mediacontroller = new MediaController(ctx); mediacontroller.setAnchorView(vvVideos); Uri video = Uri.parse("android.resource://" + packageName +"/"+R.raw.sample); vvVideos.setMediaController(mediacontroller); LayoutParams params=vvVideos.getLayoutParams(); params.height=150; vvVideos.setLayoutParams(params); vvVideos.setVideoURI(video); vvVideos.requestFocus(); vvVideos.setOnPreparedListener(new OnPreparedListener() { public void onPrepared(MediaPlayer mp) { vvVideos.start(); } }); 

现在video开始在活动创build时播放。 我想按以下方式进行我的活动

  1. 当活动开放时,video不应播放。
  2. 它应该显示开始的video图像(目前它显示黑色)
  3. 只有当用户点击video时才应该播放。
    请帮帮我。

使用seekTo()来显示第一帧。

确保电影已暂停,然后使用seekTo()显示video的第一帧:

 VideoView mVideoView = (VideoView) findViewById(R.id.video_preview); mVideoView.setVideoURI(yourVideoPath); mVideoView.seekTo(100); // 100 milliseconds (0.1 s) into the clip. 

点击时播放它已被@Lingviston在另一个答案中回答。

使用这个创buildvideo缩略图

 Bitmap thumb = ThumbnailUtils.createVideoThumbnail("file path/url", MediaStore.Images.Thumbnails.MINI_KIND); 

并设置为videoview

 BitmapDrawable bitmapDrawable = new BitmapDrawable(thumb); mVideoView.setBackgroundDrawable(bitmapDrawable); 

1)删除你的onPrepareListener。 我不知道为什么你的video在活动创build后开始播放,但在videoView.start()之后调用onPrepareListener。

2)在VideoView顶部添加一个ImageView小部件到你的布局。 然后像这样设置另一个onPrepareListener:

 vvVideos.setOnPreparedListener(new OnPreparedListener() { public void onPrepared(MediaPlayer mp) { previewImage.setVisibility(View.GONE); } }); 

我注意到,onPreparedListener触发得太早,所以你可以使用

new Handler().postDelay(Runnable, timeInMilis)

closures预览图像。

3)添加OnTouchListener与任何手势检测到你的VideoView。 这里是我现在使用的一个例子:

  @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_video); mGestureDetector = new GestureDetector(this, mGestureListener); ((VideoView) findViewById(R.id.activity_video_videoview)).setOnTouchListener(mTouchListener); } private OnTouchListener mTouchListener = new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { mGestureDetector.onTouchEvent(event); return true; } }; private SimpleOnGestureListener mGestureListener = new SimpleOnGestureListener() { @Override public boolean onSingleTapConfirmed(MotionEvent e) { if(mVideoView.isPlaying()) mVideoView.pause(); else mVideoView.start(); return true; }; }; 

它通过水龙头开始/停止播放。

以为我会分享我的解决scheme。 seekTo方法很好,但只适用于某些设备。 这是我的工作。 我在onPreparedListener的onPrepared方法中处理这个问题,但是它取决于你。

 @Override public void onPrepared(MediaPlayer mp) { MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever(); mediaMetadataRetriever.setDataSource(uri.getPath()); try { Bitmap bitmap = mediaMetadataRetriever.getFrameAtTime(currentPosition); videoView.setBackgroundDrawable(new BitmapDrawable(bitmap)); } catch (OutOfMemoryError outOfMemoryError) { //Not entirely sure if this will ever be thrown but better safe than sorry. videoView.seekTo(currentPosition); } } 

现在,当你播放video时,你需要删除这样的背景图片:

 private void play() { ... videoView.setBackgroundDrawable(null); .. } 

请享用!

我知道这是一个古老的问题,但我需要相同的解决scheme,无法在其他地方find答案,所以我做了解决scheme,我在这里分享爱:

我刚刚为它创build了一个小类:

  public class LoadFirstVideoFrame implements Runnable { private static Handler uiHandler = new Handler(Looper.getMainLooper()); private VideoView videoView; private LoadFirstVideoFrame(VideoView videoView) { this.videoView = videoView; videoView.start(); videoView.resume(); uiHandler.post(this); } public void stop() { videoView = null; uiHandler.removeCallbacks(this); } @Override public void run() { if (videoView == null) return; if (videoView.isPlaying()) { videoView.pause(); videoView.seekTo(0); videoView = null; } else { uiHandler.post(this); } } } 

它只是简单地要求开始播放,并在第一帧暂停video,只要它真的在播放(意味着它已经加载了文件,并且已经在SurfaceView中渲染了)。

这里需要注意的一点是记得在这个类上调用stop() ,这样可以正确清理,而不是内存泄漏任何东西。

我希望它有帮助。

只要寻求video100毫秒,它显示缩略图使用seekTo()方法

 videoView.seekTo(100);