失去焦点时,Android Media Controller会隐藏

时间:2014-04-09 13:08:33

标签: android android-mediaplayer

我使用与媒体播放器关联的媒体控制器播放声音。问题是媒体控制器一丢失焦点就会隐藏起来。我有一个按钮,当按下时,播放声音,媒体控制器显示在屏幕的底部。

但是当按下生命暂停时,在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()实际上是启动媒体控制器的。 我的问题是,为什么媒体控制器会在用户触摸后几秒钟后自行隐藏?这有什么解决方案吗?

1 个答案:

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