Android - 我的应用程序中使用的音量按钮

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2874743/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 07:41:41  来源:igfitidea点击:

Android - Volume Buttons used in my application

android

提问by Iuliu Atudosiei

I need to use volume buttons to control a variable parameter in my application. I use Activity.onKeyDownto get notified when the button is pressed but the media volume is also increased.
Android is doing something like below when I press the volume key:

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

  1. increase media / ringtone volume
  2. pass the event to my application
  1. 增加媒体/铃声音量
  2. 将事件传递给我的应用程序

Is there a way to avoid increasing the system volume and use volume key only for my application?

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

回答by yanchenko

You need to capture all actions:

您需要捕获所有操作:

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

回答by Andrew

The next would be better because a long click for KeyEvent.KEYCODE_VOLUME_UPdoes not work right in the previous answer.

下一个会更好,因为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);
    }
}

回答by Jawad Zeb

I've used this code to listen for the volume button before.

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

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

回答by aglour

Just to complete the previous answers, if you want long click support you should check how long the key was down using:

只是为了完成之前的答案,如果您想要长按支持,您应该使用以下方法检查键关闭的时间:

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

In the end the code will look like this:

最后,代码将如下所示:

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

回答by user3566272

Volume Button Usage in Fragments

片段中的音量按钮使用

If you desire to implement this in fragments bound the Activity ,you can use as:

如果您希望在绑定 Activity 的片段中实现这一点,您可以使用:

Notice:fragment_words is just a layout name which is used arbitarly

注意: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;
                }
            }
        });}

回答by sanjay

volume with double click action

双击动作音量

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

回答by Elad

i had a problem with the AB shutter (bluetooth) always launching the volume up, while i wanted to use the bluetooth keyevent for something else. but i still wanted the volume up to work when coming from the device's volume up button. the solution i found was to handle short events for my purpose - and to allow volume up change only if pressing on the device's button for over a second. see code:

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

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