MediaController的默认SeekBar不同步

时间:2017-04-26 06:45:08

标签: android android-videoview seekbar mediacontroller

我正在使用VideoView和MediaController添加基本视频播放器。

MediaController提供的SeekBar在视频播放结束时0:02分钟停止。 我在3种不同视频长度的设备上试过这个。

如何确保SeekBar的进度和时间与视频同步?

以下是相关代码:

VideoPlayerDialog.java

videoView.setVisibility(View.VISIBLE);
MediaController mediaController = new MediaController(getContext());

FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.BOTTOM;
mediaController.setLayoutParams(lp);

((ViewGroup) mediaController.getParent()).removeView(mediaController);
((FrameLayout) findViewById(R.id.videoViewWrapper)).addView(mediaController);

videoView.setMediaController(mediaController);
videoView.setVideoURI(imageUri);
videoView.requestFocus();

dialog_image_preview.xml

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/black87">

    <uk.co.senab.photoview.PhotoView
        android:id="@+id/photo_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerInParent="true" />

    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/videoViewWrapper"
        android:layout_centerInParent="true"
        android:layout_margin="30dp">

        <VideoView
            android:id="@+id/videoplayer"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </FrameLayout>

    <ImageButton
        android:id="@+id/close"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:background="@drawable/circular_button_material"
        android:elevation="10dp"
        android:padding="5dp"
        android:src="@drawable/ic_close" />
</RelativeLayout>

3 个答案:

答案 0 :(得分:1)

我找到了答案。在MediaController构造函数中,覆盖它this.show() void并在其中使用show(0),以便MediaController显示它何时隐藏。 这样做的原因是,默认情况下MediaController会在3秒后自动隐藏自身,即使使用hide()也是如此。因此,如果您强制显示MediaController,它仍然会在3秒后隐藏它(搜索栏停止同步,播放/暂停按钮不更新)。覆盖hide() void以显示MediaController可以解决此问题。

您还可以创建一个自定义类,将MediaPlayer扩展为ovverride final MediaController mediaController = new MediaController(context){ @Override public void hide() { this.show(); } };

示例代码:

{{1}}

答案 1 :(得分:0)

您可以尝试使用

自动将媒体控制器连接到视频视图

MediaController mediaController = new MediaController(this); mediaController.setAnchorView(videoView); videoView.setMediaController(mediaController);

答案 2 :(得分:0)

遵循 here 的参考,我能够解决搜索栏在 2 秒后停止的问题和屏幕冻结的后退问题。

我使用 dispatchkeyevent 来检测后退并在视频开始后显示媒体控制器。

        videoView.setOnPreparedListener { mp ->

        progressBar.visibility = View.GONE

        mc = object : MediaController(mContext) {

            override fun dispatchKeyEvent(event: KeyEvent): Boolean {

                if (event.keyCode == KeyEvent.KEYCODE_BACK) {
                    super.hide()//Hide mediaController
                    scoreDialog.dismiss()//Close this dialog/activity

                    return true//If press Back button, finish here
                }
                //If not Back button, other button work as usual.
                return super.dispatchKeyEvent(event)
            }

        }
        videoView.setMediaController(mc)
        mc.setAnchorView(videoView)

        (mc.parent as ViewGroup).removeView(mc)

        (scoreDialog.findViewById(R.id.videoViewWrapper) as FrameLayout).addView(mc)
        
        mp.start()
        mc.show(0)
    }