视频播放状态的事件或媒体控制器的播放/暂停。

32

我似乎找不到监听播放状态的事件。 我主要感兴趣的是播放/暂停状态。 我正在使用MediaController,它有一个播放/暂停按钮,但我还有一个辅助按钮也可以控制播放/暂停。 使用我的自定义按钮,我可以播放/暂停,但如果我使用MediaController里的播放/暂停按钮播放/暂停,我目前没有办法将我的自定义播放/暂停按钮上的图像更改为播放或暂停。

是否有我不知道的事件,可以在播放/暂停期间进行一些操作?

这是一个非常相似的问题:如何捕获在MediaController上单击暂停/播放按钮时的事件

2个回答

97

如果您正在将MediaControllerVideoView结合使用,那么扩展后者并添加自己的监听器应该相对容易。

自定义的VideoView在其最基本形式下会像这样:

public class CustomVideoView extends VideoView {

    private PlayPauseListener mListener;

    public CustomVideoView(Context context) {
        super(context);
    }

    public CustomVideoView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomVideoView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public void setPlayPauseListener(PlayPauseListener listener) {
        mListener = listener;
    }

    @Override
    public void pause() {
        super.pause();
        if (mListener != null) {
            mListener.onPause();
        }
    }

    @Override
    public void start() {
        super.start();
        if (mListener != null) {
            mListener.onPlay();
        }
    }

    public static interface PlayPauseListener {
        void onPlay();
        void onPause();
    }

}

使用它与使用常规的 VideoView 完全相同,唯一的区别是我们现在可以将自己的监听器连接到它上面。

// Some other code above...
CustomVideoView cVideoView = (CustomVideoView) findViewById(R.id.custom_videoview);
cVideoView.setPlayPauseListener(new CustomVideoView.PlayPauseListener() {

    @Override
    public void onPlay() {
        System.out.println("Play!");
    }

    @Override
    public void onPause() {
        System.out.println("Pause!");
    }
});

cVideoView.setMediaController(new MediaController(this));
cVideoView.setVideoURI(...);
// or
cVideoView.setVideoPath(...);
// Some other code below...

最后,您也可以在xml布局中声明它并进行充气(如上所示)-只需确保使用<package_name>.CustomVideoView。例如:

<mh.so.CustomVideoView android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:id="@+id/custom_videoview" />

2
太棒了!谢谢您,先生,那个完美地解决了问题。+50分给你。我迫不及待地想要像掌握其他技能(如ActionScript)一样熟练地掌握Java。 - Ronnie
1
很高兴能够提供帮助。 :) 顺便说一下,调用 super 通常与重写方法一起使用。通过重写,您基本上正在重新定义基类/超级/父类的方法。如果在这样的重写方法中调用 super,则将保留其功能,这是如果您的目标是添加功能,则需要执行的操作。但有时您可能想要替换功能,在这种情况下,不调用 super 可能会得到所需的结果。 - MH.
@MH. 我们能否获取缓冲状态,即视频视图正常工作,但由于网络连接差/慢而在中途停止缓冲,然后再次播放等。那么我们如何分析该状态,以便我可以设置等待/缓冲进度条。 - Shadik Khan
@Sadiq:不幸的是,VideoView没有提供任何回调来获取缓冲更新。但是,您可以尝试在OnPreparedListener回调中获取对底层MediaPlayer实例的引用,并将OnBufferingUpdateListener设置为该实例。请注意,这将覆盖VideoView的侦听器,但这不应该是什么大问题,因为后者仅使用它来跟踪缓冲百分比(但不在任何地方使用它,除了在getBufferPercentage()中返回它)。 - MH.

2

1
如果我在pause()start()方法上使用了@Override,那么如何像dispatchEvent方法(dispatchEvent是ActionScript中的方法)一样,在自定义的MediaController上监听事件呢?同时,我还需要保留pausestart的所有正常行为,这种情况下是否需要使用super关键字?我并不真正理解super - Ronnie

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