MediaController总是在Android上显示

25

我在我的应用程序中使用mediacontroller,但它只显示3秒钟。我已经搜索了很多,但是在每个文档中我只看到show函数、设置超时,但这没有任何效果。如何让mediacontroller一直显示?

我尝试了show(0),但没有效果。

10个回答

27
您可以扩展MediaController类,并以编程方式将其实例设置为VideoView类:
import android.content.Context;
import android.util.AttributeSet;
import android.widget.MediaController;

public class MyMediaController extends MediaController {
    public MyMediaController(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyMediaController(Context context, boolean useFastForward) {
        super(context, useFastForward);
    }

    public MyMediaController(Context context) {
        super(context);
    }

    @Override
    public void show(int timeout) {
        super.show(0);
    }

}

以下是使用方法:

VideoView myVideoView = (VideoView) findViewById(R.id.my_video_view);
MediaController mc = new MyMediaController(myVideoView.getContext());
mc.setMediaPlayer(myVideoView);
myVideoView.setMediaController(mc);

13

您可以内联创建匿名类并覆盖某些方法。您需要覆盖hide方法并在其中什么也不做。您还需要覆盖dispatchKeyEvent方法以检查后退键按下并调用super.hide()。否则,在按下后退键时,控制器将不会隐藏,并且无法关闭活动。

 mediaController = new MediaController(this){
        @Override
        public void hide() {
            // TODO Auto-generated method stub
            //do nothing
        }

        @Override
        public boolean dispatchKeyEvent(KeyEvent event) {

            if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) {

                if (mediaPlayer != null) {
                    mediaPlayer.reset();
                    mediaPlayer.release();
                    mediaPlayer = null;
                }
                super.hide();
                Activity a = (Activity)getContext();
                a.finish();

            }
        return true;
        }
    };

1
当我覆盖这些函数时,我的音量控件(屏幕和设备按钮)完全无法工作。 - blackcompe
1
在最后一篇帖子中的代码(http://stackoverflow.com/questions/23338989/android-overriding-back-button-causes-volume-buttons-stop-working)完美地运行。 - blackcompe
只有在 event.getKeyCode() == KeyEvent.KEYCODE_BACK 的情况下才返回 true。否则,返回 false,然后其他设备按钮将继续工作。 - Chris Read
此外,在结束活动之前添加 mediaController.hide() - Chris Read

12

您还可以创建一个内联的匿名类并在其中覆盖隐藏方法,而不必为此创建一个全新的类:

mediaController = new MediaController(this) {
    @Override
    public void hide() {
    //Do not hide.
    }
};

4
为什么要踩我?按照常规礼貌,踩我时应该解释一下原因。 - Gerard

11

6
你需要做的是,在自定义控制器中覆盖hide方法并不做任何事情。
public class MyMediaController extends MediaController {
..
@Override
    public void hide() {
        // Do nothing here in order to always show

    }
...
}

PS:您仍需点击视频以显示媒体控制器。


如何在不选择任何视频的情况下显示媒体控制器 - 当然,在选择视频之前它是无法使用的 - 但是可以使其占据该空间。 - Jasper

6
我尝试了所有的方法,以下代码对我有效!
    mVideoView = (VideoView) findViewById(R.id.video);

    mMediaController = new MediaController(this) {
        //for not hiding
        @Override
        public void hide() {}

        //for 'back' key action
        @Override
        public boolean dispatchKeyEvent(KeyEvent event) {
            if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
                Activity a = (Activity)getContext();
                a.finish();
            }
            return true;
        }
    };

    mMediaController.setAnchorView(mVideoView);
    mMediaController.setMediaPlayer(mVideoView);
    mVideoView.setMediaController(mMediaController);
    mMediaController.requestFocus();

    //only this showed the controller for me!!
    mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mVideoView.start();
            mMediaController.show(900000000);
        }
    });

    //finish after playing
    mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mediaPlayer) {
            finish();
        }
    });

2

这可能是一个旧帖子,但仍未得到回答,尝试这个:

final MediaController mediaController = new MediaController(this);
mediaController.setAlwaysDrawnWithCacheEnabled(true);
mediaController.setAnchorView(vView);
mediaController.requestFocus(); 
    vView.setOnPreparedListener( new OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mediaController.show( 0 );
        }
    });

vView.setVideoPath(Preview_Path);
vView.setMediaController(mediaController);
vView.start(); 

在MediaController类的“show”方法中有一个注释

**Use 0 to show
* the controller until hide() is called**

因此,使用900000或更大的值是没有帮助的。 希望能帮到您。

祝愉快。


2

试试这个:

videoView.setOnCompletionListener(onVideoCompleted);
videoView.setOnPreparedListener(onVideoPrepared);

mc.setAnchorView(videoView);
mc.setMediaPlayer(videoView);

MediaController mc = new MediaController(this);
videoView.setMediaController(mc);

MediaPlayer.OnPreparedListener onVideoPrepared = new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mc.show(0);
    }
};

MediaPlayer.OnCompletionListener onVideoCompleted = new MediaPlayer.OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mp) {
        mc.hide();
    }
};

0

很简单!在隐藏事件中设置可见性为“GONE”,在显示事件中设置可见性为“VISIBLE”!

        MediaController mc= new MediaController(zoom.this){

            @Override
            public void setMediaPlayer(MediaPlayerControl player) {
                super.setMediaPlayer(player);
                this.show(4000);
            }
            @Override
            public void show(int timeout) {
                super.show(timeout);
                this.setVisibility(View.VISIBLE);
            }
            //instead of press twice with press once "back" button to back
            @Override
            public boolean dispatchKeyEvent(KeyEvent event) {
                if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
                    Activity a = (Activity)getContext();
                    a.finish();
                }
                return true;
            }
            @Override
            public void hide() {
                // TODO Auto-generated method stub
                super.hide();
                this.setVisibility(View.GONE);
                //super.show(3000);
            }

        };

0
我想让视频控制器渐隐,并始终在音频中显示它。这个做法有效。
    mController = new MediaController(this) {
        @Override
        public void hide() {

            if (mType != TYPE_AUDIO) super.hide();
        }

        @Override
        public boolean dispatchKeyEvent(KeyEvent event) {
            if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
                mController.hide();
                Activity a = (Activity)getContext();
                a.finish();
                return true;
            }
            return false;
        }
    };

在MediaPlayer.onPrepared中,我添加了以下内容:
if (mType == TYPE_AUDIO) mController.show(0);

这会导致控制器在音频播放开始时显示,但不会在视频播放时显示。

其他手机控制按钮仍然正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接