首页 文章

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

提问于
浏览
13

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

我尝试这段代码:

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

           mVideoView.seekTo(progress);
}

3 回答

  • 4

    VideoView 没有 OnSeekCompleteListener() 但您可以从 VideoViewonPrepared 方法访问 MediaPlayer 然后设置 OnSeekCompleteListener ,如下所示:

    mVideoView.setOnPreparedListener(new OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
    
            mp.setOnSeekCompleteListener(new OnSeekCompleteListener() {
                @Override
                public void onSeekComplete(MediaPlayer mp) {
                    //TODO: Your code here
                }
            });
    
        }
    });
    
  • 25

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

    但是,正如里诺所说,标准 VideoView 不支持 OnSeekCompleteListener .

    But you can copy and locally customize the VideoView class to add this support yourself.

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

    将VideoView.java复制到Eclipse Android项目中,它将开始构建但失败 . 这是我为编译而做的事情:

    • 更新package语句以匹配您的项目 .

    • 注释掉对 MetaData 的引用 . 对此的修复是在我的待办事项列表上 . 这些需要替换为MediaMetadataRetriever的调用 .

    • 通过调用 getBaseContext() 替换 mContext

    现在您已准备好为 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;
        }
    }
    

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

    • 更新对 android.widget.VideoView 的引用以使用您自定义的 VideoView .

    • 实现一个监听器并通过调用 setOnSeekCompleteListener() 来设置它 .

    您的代码现在会在搜索真正完成时收到通知,然后可以执行后续搜索 .

  • 3

    你必须等待寻求完成,遗憾的是 VideoView 没有 OnSeekCompleteListener() (为什么谷歌?-_-)

相关问题