我使用与媒体播放器关联的媒体控制器播放声音。问题是媒体控制器一丢失焦点就会隐藏起来。我有一个按钮,当按下时,播放声音,媒体控制器显示在屏幕的底部。
但是当按下生命暂停时,在5秒之后,媒体控制器本身就会隐藏。
这是我的代码的一部分。我会在媒体控制器隐藏后立即停止媒体播放器,以便不再继续播放声音
媒体控制器的所有代码均为:
mediaPlayer = new MediaPlayer();
mediaPlayer.setOnPreparedListener(currentFragment);
mediaController = new MediaController(getActivity()){
@Override
public void hide()
{
if(mediaPlayer.isPlaying()){
mediaPlayer.stop();
}
super.hide();
}
};
try {
mediaPlayer.setDataSource(sound.getSound());
mediaPlayer.prepareAsync();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mediaPlayer.start();
@Override
public void onPrepared(MediaPlayer mp) {
Log.d("media status", "onPrepared");
handler.post(new Runnable() {
public void run() {
launchMediaController();
progress.dismiss();
}
});
}
void launchMediaController(){
mediaController.setEnabled(true);
mediaPlayer.start();
mediaController.setMediaPlayer(soundController);
mediaController.setAnchorView(getView());
mediaController.show(0);
}
private class SoundController implements MediaController.MediaPlayerControl{
public void start() {
mediaPlayer.start();
}
public void pause() {
mediaPlayer.pause();
}
public int getDuration() {
return mediaPlayer.getDuration();
}
public int getCurrentPosition() {
return mediaPlayer.getCurrentPosition();
}
public void seekTo(int i) {
mediaPlayer.seekTo(i);
}
public boolean isPlaying() {
return mediaPlayer.isPlaying();
}
public int getBufferPercentage() {
return 0;
}
public boolean canPause() {
return true;
}
public boolean canSeekBackward() {
return true;
}
public boolean canSeekForward() {
return true;
}
@Override
public int getAudioSessionId() {
// TODO Auto-generated method stub
return 0;
}
}
编辑: 根据利宾的回答,我做了以下但没有成功: 扩展MediaController并覆盖触摸事件
private class MyMediaController extends MediaController{
public MyMediaController(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return true;
}
}
使用扩展类
mediaController = new MyMediaController(getActivity()){
@Override
public void hide()
{
if(mediaPlayer.isPlaying()){
mediaPlayer.stop();
}
super.hide();
}
};
launchMediaController()实际上是启动媒体控制器的。 我的问题是,为什么媒体控制器会在用户触摸后几秒钟后自行隐藏?这有什么解决方案吗?
答案 0 :(得分:2)
当您调用show()时,您可以设置持续时间以在屏幕上显示控制器。所以控制器会在“超时”毫秒不活动后自动隐藏。
您可以将超时设置为0,以显示控制器,直到显式调用hide。
controller.show(0);
使用0显示控制器,直到调用hide()。
如果使用不带参数的show()方法,则默认超时为3秒
以下是 show(int timeOut)方法调用的一些代码
Message msg = mHandler.obtainMessage(FADE_OUT);
if (timeout != 0) {
mHandler.removeMessages(FADE_OUT);
mHandler.sendMessageDelayed(msg, timeout);
}
如果超时id不为0,则处理程序发送延迟消息,如果消息为FADE_OUT,则处理程序将发送延迟消息
修改强>
MediaController代码中存在错误。在onTouchEvent中,设置了默认超时,它将覆盖超时0.
@Override
public boolean onTouchEvent(MotionEvent event) {
show(sDefaultTimeout);
return true;
}
您可以通过创建自定义MediaController并覆盖onTouchEvent来修复此问题
@Override
public boolean onTouchEvent(MotionEvent event) {
return true;
}