2010-12-16 106 views
17

我在我的应用程序中使用了mediacontroller,但它只显示了3秒钟。我搜索了很多,但在每个文档中,我只看到了显示功能,设置超时,但它没有效果。我怎样才能始终显示媒体控制器?MediaController始终显示在Android上

我测试过show(0),但它没有效果。

回答

23

你可以它的一个实例扩展的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); 
5

你需要做的是,overrride的在自定义控制器中隐藏方法并且什么都不做。

public class MyMediaController extends MediaController { 
.. 
@Override 
    public void hide() { 
     // Do Nothing to keep the show the controller all times 

    } 
... 
} 

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

+0

如何在不选择任何视频的情况下显示媒体控制器 - 当然,只有在选择了视频后才能正常工作,但要占用该空间。 – Jasper 2015-01-07 05:45:26

7

您还可以创建一个匿名类内联和重写隐藏方法有,而不必创建一个全新的类是:

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

为什么downvote?解释下调时的常见礼节 – Gerard 2014-08-20 19:24:25

11

您可以创建匿名类内联和重写某些方法。你需要重写隐藏方法,并在那里不做任何事情。您还需要重写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 2014-08-12 13:06:49

+1

最后一篇文章中的代码(http://stackoverflow.com/questions/23338989/android-overriding-back-button-causes-volume-buttons-stop-working)完美地工作。 – blackcompe 2014-08-12 13:12:02

+0

只有'event.getKeyCode()== KeyEvent.KEYCODE_BACK'返回true。否则'返回false',然后其他设备按钮将继续工作 – 2017-03-07 14:09:12

4

在尝试了所有我能做到的事情之后,下面的代码适用于我!

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

使用这个,这为我工作: mediaController.show(0); – ralphgabb 2015-02-24 01:37:33

0

这可能是一个古老的线程,但仍然没有答案,试试这个:

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类的注释中 “秀” 的方法

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

所以用90万或较大的值不会帮助。 希望它可以帮助你。

欢呼声。

0

试试这个:

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

我想褪色的视频控制器,并始终显示它的音频。这工作

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

这使得控制器在音频播放的开始展现,而不是视频的播放。

其他手机控制按钮继续正常工作。

0

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

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

     };