我正在使用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>
答案 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)
}