【问题标题】:MediaController's default SeekBar not in syncMediaController 的默认 SeekBar 不同步
【发布时间】:2017-04-26 06:45:07
【问题描述】:

我正在添加一个带有 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>

【问题讨论】:

    标签: android android-videoview seekbar mediacontroller


    【解决方案1】:

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

    您还可以创建一个自定义类,将 MediaPlayer 扩展为 ovverride hide()

    示例代码:

    final MediaController mediaController =  new MediaController(context){
        @Override
        public void hide() {
            this.show();
        }
    };
    

    【讨论】:

    • 这看起来是个不错的答案。但是,我找到了另一种使用此代码的方法。无法自己测试答案。如果有人确认,我会将其标记为正确答案。
    • @HarishVishwakarma - 你的其他方式是什么?您可以随时发表评论。
    • 我测试过它真的有效!!但问题是我在对话框中播放视频,按后退按钮后它会冻结屏幕,如果我删除此行视频对话框关闭得很好,后按也没有问题,但搜索栏在 2 秒后停止
    • @AnshulKhare 已经有一段时间了,但是您可以尝试创建 MediaController 的子类,添加字段 private bool shouldSync = false;,为 shouldSync 添加 getter 和 setter,然后覆盖 hide 并编写if (shouldSync) show();。现在您可以在对话框打开时执行mMediaCtrl.setShouldSync(true);,在对话框关闭时执行mMediaCtrl.setShouldSync(false);
    【解决方案2】:

    您可以尝试使用

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

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

    【讨论】:

    • 谢谢,但这不起作用。它只是隐藏了 videoview 下方的播放控件,但搜索栏更新没有任何变化。
    【解决方案3】:

    根据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)
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-29
      • 2012-10-28
      相关资源
      最近更新 更多