Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android MediaController';s默认SeekBar不同步_Android_Android Videoview_Seekbar_Mediacontroller - Fatal编程技术网

Android MediaController';s默认SeekBar不同步

Android MediaController';s默认SeekBar不同步,android,android-videoview,seekbar,mediacontroller,Android,Android Videoview,Seekbar,Mediacontroller,我正在添加一个带有VideoView和MediaController的基本视频播放器 MediaController提供的SeekBar在0:02分钟停止,同时视频一直播放到结束。 我在3个不同的设备上用不同的视频长度尝试过这个 如何确保SeekBar进度和时间与视频同步 以下是相关代码: VideoPlayerDialog.java videoView.setVisibility(View.VISIBLE); MediaController mediaController = new Medi

我正在添加一个带有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();
对话框\u image\u 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>

您可以尝试使用将媒体控制器自动连接到视频视图

MediaController-MediaController=新的MediaController(此);
mediaController.setAnchorView(视频视图);

videoView.setMediaController(mediaController)

您可以尝试使用将媒体控制器自动连接到视频视图

MediaController-MediaController=新的MediaController(此);
mediaController.setAnchorView(视频视图);

videoView.setMediaController(mediaController)

我找到了答案。在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();
    }
};

我找到了答案。在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();
    }
};
根据引用,我能够解决seekbar的问题,该问题在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)
    }
根据引用,我能够解决seekbar的问题,该问题在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)
    }

谢谢,但那不行。它只是隐藏了videoview下面的播放控件,但没有随seekbar更新而更改。谢谢,但这不起作用。它只是隐藏了videoview下面的播放控件,但没有随seekbar更新而更改。这看起来是一个很好的答案。然而,我找到了使用此代码的另一种方法。我自己无法测试答案。如果有人证实了,我会把这个标记为正确答案。@HarishVishwakarma-你的另一个方法是什么?你可以随时发表评论。我测试了它,它真的很有效!!但问题是我在对话框中播放了视频,按下“后退”按钮后,它会冻结屏幕,如果我删除此行,视频对话框将完全关闭,并且没有问题,同时按下“后退”按钮,但seekbar会在2秒后停止sec@AnshulKhare虽然已经有一段时间了,但您可以尝试创建MediaController的子类,添加一个字段
private bool shouldSync=false
,为
shouldSync
添加getter和setter,然后重写
hide
并写入
if(shouldSync)show()。现在您可以执行mMediaCtrl.setShouldSync(true)
mMediaCtrl.setShouldSync(false)对话框关闭。这看起来是一个很好的答案。然而,我找到了使用此代码的另一种方法。我自己无法测试答案。如果有人证实了,我会把这个标记为正确答案。@HarishVishwakarma-你的另一个方法是什么?你可以随时发表评论。我测试了它,它真的很有效!!但问题是我在对话框中播放了视频,按下“后退”按钮后,它会冻结屏幕,如果我删除此行,视频对话框将完全关闭,并且没有问题,同时按下“后退”按钮,但seekbar会在2秒后停止sec@AnshulKhare虽然已经有一段时间了,但您可以尝试创建MediaController的子类,添加一个字段
private bool shouldSync=false
,为
shouldSync
添加getter和setter,然后重写
hide
并写入
if(shouldSync)show()。现在您可以执行mMediaCtrl.setShouldSync(true)
mMediaCtrl.setShouldSync(false)打开对话框关闭。