【问题标题】:Android - Volume Buttons used in my applicationAndroid - 我的应用程序中使用的音量按钮
【发布时间】:2010-05-20 14:36:58
【问题描述】:

我需要使用音量按钮来控制我的应用程序中的可变参数。 我使用Activity.onKeyDown 在按下按钮时收到通知,但媒体音量也会增加。
当我按下音量键时,Android 正在执行以下操作:

  1. 增加媒体/铃声音量
  2. 将事件传递给我的应用程序

有没有办法避免增加系统音量并仅为我的应用程序使用音量键?

【问题讨论】:

    标签: android


    【解决方案1】:

    您需要捕获所有操作:

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        int action = event.getAction();
        int keyCode = event.getKeyCode();
            switch (keyCode) {
            case KeyEvent.KEYCODE_VOLUME_UP:
                if (action == KeyEvent.ACTION_DOWN) {
                    //TODO
                }
                return true;
            case KeyEvent.KEYCODE_VOLUME_DOWN:
                if (action == KeyEvent.ACTION_DOWN) {
                    //TODO
                }
                return true;
            default:
                return super.dispatchKeyEvent(event);
            }
        }
    

    【讨论】:

    • @yanchenko 是否可以通过音量键打开第二个活动
    • 如何知道是系统、音乐还是闹钟,音量键在变化?
    • 如果设备连接到蓝牙耳机怎么办?
    【解决方案2】:

    下一个会更好,因为长按KeyEvent.KEYCODE_VOLUME_UP 在上一个答案中不起作用。

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        int action = event.getAction();
        int keyCode = event.getKeyCode();
        switch (keyCode) {
            case KeyEvent.KEYCODE_VOLUME_UP:
                if (action == KeyEvent.ACTION_DOWN) {
                    //TODO
                }
                return true;
            case KeyEvent.KEYCODE_VOLUME_DOWN:
                if (action == KeyEvent.ACTION_DOWN) {
                    //TODO
                }
                return true;
            default:
                return super.dispatchKeyEvent(event);
        }
    }
    

    【讨论】:

      【解决方案3】:

      只是为了完成之前的答案,如果您想要长按支持,您应该检查键被按下的时间:

      event.getEventTime() - event.getDownTime() > ViewConfiguration.getLongPressTimeout() 
      

      最后的代码是这样的:

          @Override
      public boolean dispatchKeyEvent(KeyEvent event) {
          int action = event.getAction();
          int keyCode = event.getKeyCode();
          switch (keyCode) {
              case KeyEvent.KEYCODE_VOLUME_UP:
                  if (action == KeyEvent.ACTION_UP) {
                      if (event.getEventTime() - event.getDownTime() > ViewConfiguration.getLongPressTimeout()) {
                          //TODO long click action
                      } else {
                          //TODO click action
                      }
                  }
                  return true;
              case KeyEvent.KEYCODE_VOLUME_DOWN:
                  if (action == KeyEvent.ACTION_UP) {
                      if (event.getEventTime() - event.getDownTime() > ViewConfiguration.getLongPressTimeout()) {
                          //TODO long click action
                      } else {
                          //TODO click action
                      }
                  }
                  return true;
              default:
                  return super.dispatchKeyEvent(event);
          }
      }
      

      【讨论】:

        【解决方案4】:

        我之前用这个代码来监听音量按钮。

          @Override
            public boolean onKeyDown(int keyCode, KeyEvent event) {
                if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)){
                    //Do something
                }
                return true;
            }
        

        【讨论】:

          【解决方案5】:

          片段中音量按钮的使用

          如果你想在绑定 Activity 的 Fragment 中实现这一点,你可以使用 as:

          注意:fragment_words 只是一个布局名称,可以随意使用

          @Override
          public View onCreateView(LayoutInflater inflater, ViewGroup container,
                  Bundle savedInstanceState) {
          
              View rootView = inflater.inflate(R.layout.fragment_words, container, false);
          rootView.requestFocus();
              rootView.setOnKeyListener(new View.OnKeyListener() {
                      @Override
                      public boolean onKey(View v, int keyCode, KeyEvent event) {
          
                          if( keyCode == KeyEvent.KEYCOD_VOLUME_DOWN ) {
          
                              //TODO SOMETHING
                              return true;
                          } else {
                              return false;
                          }
                      }
                  });}
          

          【讨论】:

            【解决方案6】:

            双击操作音量

            public boolean onKeyDown(int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
                    i++;
                    Handler handler= new Handler();
                    Runnable runnable=new Runnable() {
                        @Override
                        public void run() {
                            i=0;
                        }
                    };
                    if(i==1){
                        Toast.makeText(getApplicationContext(),"single click",Toast.LENGTH_SHORT).show();
                        handler.postDelayed(runnable,400);
                    }
                    else if(i==2){
                        Vibrator vb = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                        vb.vibrate(100);
                    }
            
                    return true;
                }
                if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
                    return true;
                } else {
                    return super.onKeyDown(keyCode, event);
                }
            }
            

            【讨论】:

              【解决方案7】:

              我遇到了 AB 快门(蓝牙)总是调高音量的问题,而我想将蓝牙键事件用于其他用途。 但我仍然希望通过设备的音量增大按钮来提高音量。 我找到的解决方案是为我的目的处理短事件 - 并且仅在按下设备按钮超过一秒钟时才允许音量增加。 见代码:

              boolean bVolumeUpKeyDown = false;
              long StartDownMS = 0;
              
              @Override
              public boolean dispatchKeyEvent(KeyEvent event) {
                  int action = event.getAction();
                  int keyCode = event.getKeyCode();
                  switch (keyCode) {
                      case KeyEvent.KEYCODE_VOLUME_UP:
                          if (action == KeyEvent.ACTION_UP) {
                              // my handling of keyevent
                              return true;
                            }
                            else if  (action == KeyEvent.ACTION_DOWN) {
                                if(bVolumeUpKeyDown == false) {
                                    bVolumeUpKeyDown = true;
                                    StartDownMS = System.currentTimeMillis();
                                }
                                else if(System.currentTimeMillis() - StartDownMS > 1000)
                                    return super.dispatchKeyEvent(event); // normal volume up handling
                          }
                          return true;
              
                     case KeyEvent.KEYCODE_ENTER:
                         if (action == KeyEvent.ACTION_UP) {
                         //my handling of second ab shutter button
                              }
                          return true;
              
                     default:
                          return super.dispatchKeyEvent(event);
                  }
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-01-29
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多