以下活动运行正常,但只有在我点击屏幕时才会显示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();
}
}
答案 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中存在两个主要问题:
对于第一部分,它很容易修复,将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();
}
};