How to detect when VideoView starts playing (Android)?

て烟熏妆下的殇ゞ 提交于 2019-12-05 03:38:35

There is a great article about MediaPlayer in here - http://www.malmstein.com/blog/2014/08/09/how-to-use-a-textureview-to-display-a-video-with-custom-media-player-controls/

You can set infoListener on your VideoView

setOnInfoListener(new MediaPlayer.OnInfoListener() {
    @Override
    public boolean onInfo(MediaPlayer mp, int what, int extra) {

        if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
            // Here the video starts
            return true;
        }
        return false;
    }

I ended up using VideoView.setOnPreparedListener. This was enough to cover my problem (play button drawable change to pause)

Wops

accepted answer here is not 100% accurate.

sometimes onprepared is call 3 seconds before first frame is being rendered. i suggest having a callback on that event (MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START)

mMediaPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() {
    @Override
    public boolean onInfo(MediaPlayer mediaPlayer, int i, int i1) {
        if (i == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START){
            //first frame was bufered - do your stuff here
        }
        return false;
    }
});

see media info documantaion for more callbacks of info/warning: https://developer.android.com/reference/android/media/MediaPlayer.html#MEDIA_INFO_VIDEO_RENDERING_START

As far as I know, there is no event sent when video start playing in VideoView, but I can think of two options:

  1. Create a version of VideoView by yourself, that sends event in those cases.
  2. Use MediaController (which is default in VideoView)

If you want to follow option one - you can get the source of VideoView from here

isPlaying() can be called to test whether the MediaPlayer object is in the Started

Android MediaPlayer.isPlaying()

sulu.dev

Another way to detect if videoview started is using videoView.getCurrentPosition(). getCurrentPosition() returns 0 if streaming not started.

    protected Runnable playingCheck = new Runnable() {
        public void run() {
            while (true) {
                if (vw.getCurrentPosition() != 0) {
                    // do what you want when playing started
                    break;
                } else {
                    try {
                        Thread.sleep(250);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    };

Then call:

new Thread(playingCheck).start();

Please try this :

final Handler h = new Handler();
                h.postDelayed( new Runnable() {
                    public void run() {
                            if (videoView.getCurrentPosition() != 0) {
                                ((ProgressBar) rootView.findViewById(R.id.pgStreaming)).setVisibility(View.GONE);
                            } else {
                                h.postDelayed(this, 250);
                            }
                    }
                }, 250);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!