Android媒体控制器显示短时间显示

时间:2011-06-30 05:20:53

标签: android mediacontroller

以下活动运行正常,但只有在我点击屏幕时才会显示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 个答案:

答案 0 :(得分:18)

mediaController.requestFocus();

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

mVideoView.setOnPreparedListener(new OnPreparedListener() {

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

将它保留在屏幕上。 希望它有所帮助

答案 1 :(得分:1)

Neo的建议很完美。但我想将“mp.start()”添加到onPrepared(MediaPlayer mp)方法,没有它,媒体文件将无法开始播放。

答案 2 :(得分:0)

请求焦点或在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);

答案 3 :(得分:0)

MediaController中存在两个主要问题:

  1. 默认情况下自动隐藏为3秒
  2. 点击视频显示/隐藏控制栏
  3. 对于第一部分,它很容易修复,将start的默认超时值更改为零(零表示无限期,在视频开始时在内部使用),如下所示:

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

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

    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();
                    }
            };