【问题标题】:android - overriding back button causes volume buttons stop workingandroid - 覆盖后退按钮导致音量按钮停止工作
【发布时间】:2014-04-28 10:44:00
【问题描述】:

我正在尝试覆盖后退按钮以停止音频播放器并关闭媒体播放器活动,但我注意到音量按钮不再起作用。我想在覆盖代码时有一个错误。 PS。在我的 MediaController 中,我重写了 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;
    }
};

【问题讨论】:

  • 我也遇到了同样的问题,请看我的回答:)
  • 我已经更新了答案试试

标签: android android-activity android-mediaplayer android-button android-event


【解决方案1】:

您的问题出在 dispatchKeyEvent() 中:

您正在为所有硬件密钥使用return true,这会阻止所有密钥响应,

而你应该使用

return super.dispatchKeyEvent(event);

返回键以外的键。

所以你的代码应该是这样的:

@Override
    public boolean dispatchKeyEvent(KeyEvent event) {
    if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) {

        if (mediaPlayer != null) {
            mediaPlayer.reset();
            mediaPlayer.release();
            mediaPlayer = null;
        } 

        finish();
        return true;
    }
    **return super.dispatchKeyEvent(event);**
}

【讨论】:

  • 我明白你的意思,你的代码让我可以使用音量按钮,但是当我启动活动并按下返回按钮时,它会崩溃并显示以下消息:Attempt to invoke virtual method 'int android.media.MediaPlayer.getCurrentPosition()' on a null object reference
【解决方案2】:

您可以改为覆盖 onBackPressed()

【讨论】:

    【解决方案3】:

    你应该这样使用

    @Override
        public boolean dispatchKeyEvent(KeyEvent event) {
    
            if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
    
                if (mediaPlayer != null) {
                    mediaPlayer.reset();
                    mediaPlayer.release();
                    mediaPlayer = null;
                } 
    
                finish();
                return true;
            }
            return false;
        }
    

    从方法中取出代码或尝试:

    @Override
    public void onBackPressed() {
         if (mediaPlayer != null) {
              mediaPlayer.reset();
              mediaPlayer.release();
              mediaPlayer = null;
         } 
       finish();
    }
    

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
             if (mediaPlayer != null) {
                    mediaPlayer.reset();
                    mediaPlayer.release();
                    mediaPlayer = null;
                } 
    
               finish();
               return true;
        }
    
        return super.onKeyDown(keyCode, event);
    }
    

    【讨论】:

    • 不行,我编辑了代码,请看一下。
    【解决方案4】:

    你试过这个检查它是否可以解决你的问题

    @Override
        public void onBackPressed() {
             if (mediaPlayer != null) {
                    mediaPlayer.reset();
                    mediaPlayer.release();
                    mediaPlayer = null;
                } 
    
               finish();
    
    
        }
    

    【讨论】:

    • 你从哪里得到event
    • 为什么需要将上下文转换为 Activity。 onBackPressed 是 Activity 的一种方法。所以缺少的是对 super.onBackPressed() 的调用
    • 好吧也对@blackbelt他想完成活动
    • 不行,我编辑了代码,请看一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多