gpt4 book ai didi

Android 媒体 Controller 在失去焦点时隐藏

转载 作者:行者123 更新时间:2023-11-29 21:10:42 27 4
gpt4 key购买 nike

我正在使用与媒体播放器关联的媒体 Controller 来播放声音。问题是媒体 Controller 一旦失去焦点就会隐藏起来。我有一个按钮,按下时会播放声音,媒体 Controller 会出现在屏幕底部。

但是当按下生命暂停键时,大约 5 秒后,媒体 Controller 本身会隐藏。

这是我的部分代码。我会在媒体 Controller 隐藏后立即停止媒体播放器,这样声音就不会持续播放

媒体 Controller 的所有代码是:

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

编辑:根据 Libin 的回答,我做了以下但没有成功:扩展 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() 实际上是启动媒体 Controller 的。我的问题是,为什么媒体 Controller 会在用户触摸它几秒钟后自行隐藏?有什么解决办法吗?

最佳答案

当您调用 show() 时,您可以设置在屏幕上显示 Controller 的持续时间。因此 Controller 将在“超时”毫秒不活动后自动隐藏。

您可以将超时设置为 0 ,以显示 Controller ,直到显式调用隐藏。

   controller.show(0); 

在调用 hide() 之前使用 0 显示 Controller 。

如果您使用不带参数的 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,则在处理程序中调用 hide 方法

编辑

MediaController 代码中存在错误。在 onTouchEvent 中设置了默认超时,这将覆盖超时 0。

  @Override
public boolean onTouchEvent(MotionEvent event) {
show(sDefaultTimeout);
return true;
}

您可以通过创建自定义 MediaController 并覆盖 onTouchEvent 来解决此问题

@Override
public boolean onTouchEvent(MotionEvent event) {
return true;
}

关于Android 媒体 Controller 在失去焦点时隐藏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22963547/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com