我正在添加一个基本的视频播放器与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>
发布于 2018-06-01 03:47:30
我已经找到了答案。在您的MediaController构造函数中,覆盖它的hide()
空并在其中使用this.show()
,这样当它隐藏时MediaController就会显示出来。这样做的原因是,即使使用show(0)
,MediaController在默认情况下也会在3秒后自动隐藏。因此,如果您强制显示MediaController,它仍然会在3秒后表现为隐藏状态(请查看工具栏停止同步,播放/暂停按钮不更新)。重写hide()
空来显示MediaController可以解决这个问题。
您还可以创建一个自定义类,将MediaPlayer扩展到ovverride hide()
。
示例代码:
final MediaController mediaController = new MediaController(context){
@Override
public void hide() {
this.show();
}
};
发布于 2017-04-26 22:47:10
您可以尝试使用以下命令自动将媒体控制器连接到视频视图
MediaController mediaController = new MediaController(this); mediaController.setAnchorView(videoView); videoView.setMediaController(mediaController);
发布于 2021-06-11 01:18:05
根据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)
}
https://stackoverflow.com/questions/43626853
复制相似问题