视频播放结束的监听器(或处理程序)

47

我已经实现了以下代码,以便通过其URL从远程Web服务器播放视频进行测试。

videoView = (VideoView)this.findViewById(R.id.videoView);
MediaController mc = new MediaController(this);
videoView.setMediaController(mc);
videoView.setVideoURI(Uri.parse("http://sayedhashimi.com/downloads/android/movie.mp4"));
videoView.requestFocus();

这段代码在Android模拟器中完美运行。我只是想知道是否有任何监听器(或处理程序)可以检测正在播放的视频是否已经完成?

更新:

现在我有以下代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.player);
        
    videoView = (VideoView)this.findViewById(R.id.videoView);
    playVideo();
        
    // video finish listener
    videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {        
        @Override
        public void onCompletion(MediaPlayer mp) {
            // not playVideo
            // playVideo();
            mp.start();
        }
    });
}

public void playVideo() {
    MediaController mc = new MediaController(this);
    videoView.setMediaController(mc);
    videoView.setVideoURI(Uri.parse("http://sayedhashimi.com/downloads/android/movie.mp4"));
    videoView.requestFocus(); 
}

当活动被调用时,视频可以正常播放,但当视频完成后,我希望它能够再次播放,但这并没有发生。


尝试调用 mp.start() 而不是调用 playVideo() - Anthony Forloney
是的,我已经在我的代码中替换了它。感谢您的所有帮助! 最好的问候! - Rui Gonçalves
5个回答

48

看起来你正在寻找

setOnCompletionListener(MediaPlayer.OnCompletionListener l)

可以在这里了解更详细的解释

编辑

这里展示了使用VideoViewMediaControllersetOnCompletionListener()在播放完成后调用播放的解决方案。


但我没有使用MediaPlayer,而是使用MediaController。这不是有点不同吗? - Rui Gonçalves

21

这是我的可工作代码块:

mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() 
        {           
            public void onCompletion(MediaPlayer mp) 
            {
                // Do whatever u need to do here

            }           
        });   

我正在使用OnCompleteListener,但它在视频开始时被调用。 - Mehul Tank

18
        vidView=(VideoView)findViewById(R.id.vidView);
    vidView.setMediaController(null);
    vidView.setVideoPath( "/mnt/external_sd/somerandommovie.3gp" );
    vidView.start();

    vidView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

        @Override
        public void onCompletion(MediaPlayer mp) {
                        vidView.start();
        }
    });

我发现监听器在触发,但问题是mp.start()似乎没有任何反应,所以在原始对象上再次调用start似乎可以正常工作。


在调用mp.start()之前,您只需要调用mp.seekTo(0)以返回媒体文件的开头。 - Johnny C

1
在你的onCompletion监听器中,尝试使用videoView.start()而不是mp.start()。

0

确保您在主线程上使用播放器,似乎回调只能在主线程上工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接