【问题标题】:Listener (or handler) for video finish视频完成的侦听器(或处理程序)
【发布时间】:2010-12-23 07:11:20
【问题描述】:

我已经实现了以下代码,以测试通过其 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(); 
        }

刚刚调用活动时,视频可以正常工作,但是当视频结束时,我希望它再次播放,但它没有发生。

【问题讨论】:

  • 不要调用playVideo(),而是尝试调用mp.start()
  • 是的,我已经在我的代码中替换了它。谢谢大家的帮助!最好的问候!
  • 没问题,很高兴能帮上忙。也向您致以最诚挚的问候:)

标签: android media-player


【解决方案1】:

看来你正在寻找

setOnCompletionListener(MediaPlayer.OnCompletionListener l)

更深入的解释可以找到here

编辑

This 显示了一个解决方案,其中使用VideoViewMediaControllersetOnCompletionListener() 在完成后调用播放。

【讨论】:

  • 但是我没有使用 MediaPlayer,但是是 MediaController。是不是有点不一样?
【解决方案2】:

这是我的工作代码:

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

            }           
        });   

【讨论】:

  • 我在完整的监听器上使用,但它是在视频开始时调用的
【解决方案3】:
        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)即可返回到媒体文件的开头。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    确保你在主线程上使用播放器,回调似乎只在主线程上有效。

    【讨论】:

      猜你喜欢
      • 2016-04-22
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      相关资源
      最近更新 更多