6

以下活动工作正常,但仅当我单击屏幕时才会显示 mediaController。第二个问题是媒体控制器仅显示 3 秒。我应该怎么做才能消除这个问题?

public class PlayingActivity extends Activity
{

    private VideoView mVideoView;
    private EditText mPath;
    MediaController mediaController;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.playingactivity);
        mPath = (EditText) findViewById(R.id.path);
        mPath.setText(GlobalVariable.getstrEmail());
        mVideoView = (VideoView) findViewById(R.id.surface_view);
        Uri uri = Uri.parse("/sdcard/download/test.mp3");
        mediaController = new MediaController(this);
        mediaController.findFocus();
        mediaController.setEnabled(true);
        mediaController.show(0);
        mediaController.setAnchorView(mVideoView);
        mVideoView.setMediaController(mediaController);
        mVideoView.setVideoURI(uri);
        mVideoView.start();
    }
}
4

4 回答 4

19
mediaController.requestFocus();

将使其在视频开始后立即显示(无需点击)

mVideoView.setOnPreparedListener(new OnPreparedListener() {

            @Override
            public void onPrepared(MediaPlayer mp) {
                mediaController.show(0);
            }
        });

将其保留在屏幕上。希望能帮助到你

于 2012-08-01T07:27:54.290 回答
2

在 show 方法中请求焦点或指定 0 对我来说从来没有用过。

问题是 MediaController 类的默认超时为 3000 毫秒或 3 秒。它的 show() 方法将我们给定的参数替换为其默认参数。这是谷歌未经测试的代码导致的愚蠢错误。

我们需要实现一个糟糕的解决方法,用期望值替换默认值。

试试下面的代码。它应该工作。

mediaControls = new MediaController(getActivity()){
        @Override
        public void show (int timeout){
            if(timeout == 3000) timeout = 20000; //Set to desired number
            super.show(timeout);
        }
    };
mVideoView.setMediaController(mediaControls);
于 2015-05-19T21:24:27.293 回答
1

Neo的建议是完美的。但我想在 onPrepared(MediaPlayer mp) 方法中添加“mp.start()”,否则媒体文件将无法开始播放。

于 2013-11-19T11:35:20.777 回答
0

MediaController 有两个主要问题:

  1. 自动隐藏默认3s
  2. 点击视频显示/隐藏控制栏

对于第一部分,它很容易修复将 start 的默认超时值更改为零(零表示无限期,它在视频开始时在内部使用),如下所示:

mediaController = new MediaController(this){
            @Override
            public void show() {
                super.show(0);//Default no auto hide timeout
            }
    };

第二个问题有点棘手,因为点击处理程序被声明为私有和最终的,所以我们对此没有任何控制权。我的解决方案是使用另一个功能来设置可见性并禁用隐藏功能,如下所示:

mediaController = new MediaController(this){

            @Override
            public void show() {
                super.show(0);//Default no auto hide timeout
            }
            @Override
            public void hide() {
                   //DOES NOTHING
            }

            void setVisible(boolean visible){//USE THIS FUNCTION INSTEAD
                if(visible)
                    super.show();
                else
                    super.hide();
            }
    };

如果可见性设置为 false,您还可以添加一个变量以重新启用标准功能,如下所示:

mediaController = new MediaController(this){
                private boolean forceVisible=false;

                @Override
                public void show() {
                    super.show(0);//Default no auto hide timeout
                }
                @Override
                public void hide() {
                    if(!forceVisible)super.hide();
                }

                void setVisible(boolean visible){
                    forceVisible=visible;
                    if(visible)
                        super.show();
                    else
                        super.hide();
                }
        };
于 2017-10-11T19:52:51.770 回答