VideoView无法从所需位置播放视频

时间:2011-11-03 05:50:15

标签: android

我正在使用VideoView并搜索栏,但是当我通过seekBar搜索所需位置时,它会从开始播放视频。

我尝试这段代码:

 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {

           mVideoView.seekTo(progress);
}

5 个答案:

答案 0 :(得分:25)

VideoView没有OnSeekCompleteListener(),但您可以从MediaPlayer的{​​{1}}方法访问onPrepared,然后设置VideoView },像这样:

OnSeekCompleteListener

答案 1 :(得分:4)

VideoView.seekTo()的调用是MediaPlayer.seekTo()的包装。即使仍在执行实际搜索,此函数几乎立即返回。因此,您希望等待寻求通过MediaPlayer.OnSeekCompleteListener完成。

但是,正如Reno所提到的,标准VideoView不支持OnSeekCompleteListener

但您可以复制并本地自定义VideoView课程,以自行添加此支持。

首先,从VideoView.java的副本开始。或者您可以克隆整个frameworks/base回购,但警告它要下载超过1 gig的数据。

将VideoView.java复制到Eclipse Android项目中,它将开始构建但失败。以下是我为编译而做的工作:

  1. 更新语句以匹配您的项目。
  2. 注释掉对MetaData的引用。对此的修复是在我的待办事项列表上。这些内容需要通过调用MediaMetadataRetriever来替换。
  3. 通过调用mContext
  4. 替换getBaseContext()

    现在您已准备好添加OnSeekCompleteListener的代码。实现类似于其他听众,即OnCompletionListener

    public class VideoView extends SurfaceView
            implements MediaPlayerControl {
    
        // The client's listener which is the notification callback.
        private OnSeekCompleteListener mOnSeekCompleteListener;
    
        // Set up MediaPlayer to forward notifications to client.
        private MediaPlayer.OnSeekCompleteListener mSeekCompleteListener =
            new MediaPlayer.OnSeekCompleteListener() {
            public void onSeekComplete(MediaPlayer mp) {
                if (mOnCompletionListener != null) {
                    mOnCompletionListener.onCompletion(mMediaPlayer);
                }
            }
        };
    
        // API for client to set their listener.
        public void setOnSeekCompleteListener(OnSeekCompleteListener l)
        {
            mOnSeekCompleteListener = l;
        }
    }
    

    最后,更新您自己的代码:

    1. 更新对android.widget.VideoView的引用,以使用您自定义的VideoView
    2. 通过调用setOnSeekCompleteListener()实现侦听器并进行设置。
    3. 您的代码现在会在搜索完成后收到通知,然后可以执行后续搜索。

答案 2 :(得分:3)

您必须等待搜索完成,遗憾的是VideoView没有OnSeekCompleteListener()(为什么选择Google?-_-)

答案 3 :(得分:0)

您应该使用

mVideoView.seekTo(进度,SEEK_CLOSEST)

答案 4 :(得分:0)

使用我的方法就像魅力

    1) Take mediaPlayer
        
        MediaPlayer mediaPlayer;

    2) init mediaPlayer
        
        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mediaPlayer = mp; 
            }
        });
                
    3) use seekTo method like this

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            mediaPlayer.seekTo((int) mStartPosition, MediaPlayer.SEEK_CLOSEST);
        } else {
            mediaPlayer.seekTo((int) mStartPosition);
        }