【问题标题】:Android How to listen for Volume Button events?Android 如何监听音量按钮事件?
【发布时间】:2012-02-28 01:56:43
【问题描述】:

我知道你们可能已经厌倦了这些类型的帖子,但是当我按下音量时为什么没有任何反应?我只是想编写一个简单的代码,但显然它不起作用。

package com.cakemansapps.lightwriter;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.FrameLayout;
import android.view.KeyEvent;
import android.util.Log;

public class LightWriter extends Activity implements OnTouchListener {
private static final String TAG = "Touch" ;
@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  FrameLayout main = (FrameLayout) findViewById(R.id.main_view);
}

@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) 
{
    Log.w("LightWriter", "I WORK BRO.");
    return true;
}
return super.onKeyLongPress(keyCode, event);
}

public boolean onTouch(View view, MotionEvent me) {
    throw new UnsupportedOperationException("Not supported yet.");
}

}

【问题讨论】:

标签: java android


【解决方案1】:

我不知道你是否可以获得硬件键的长按事件。

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

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

如果这对您不起作用,请告诉我们您正在测试什么设备。

科特林

override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
    if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { 
        // Do something
    }
    return true
}

【讨论】:

  • “返回真”行是否应该在“if”块内,并且默认情况下它应该返回假?如果你处理了事件,你应该只返回 true。
  • 最后一行应该是“return super.onKeyDown(keyCode, event);”而不是“返回真”。
  • 这段代码是正确的,但它会禁用减小音量的主要目的。它将优先考虑//Do something part中的语句
  • @ajdeguzman 如果你返回 false,而不是 true,我认为它也会相应地改变音量。
  • 太棒了。我怎么知道它降低了哪个音量?...例如,是系统、音乐还是闹钟?
【解决方案2】:

另一种方法

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

【讨论】:

  • 你能告诉它在设备被锁定时是如何工作的
  • 不错...如何在按下音量按钮时静音/禁用/隐藏通知? =(
  • 锁屏怎么办? @Abhisheck 你找到锁屏的答案了吗?
  • 有没有广播可以收听按键?
【解决方案3】:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)) {
        // ... your code
        return true;
    } else if ((keyCode == KeyEvent.KEYCODE_VOLUME_UP)) {
        // ... your code
        return true;
    } else
        return super.onKeyDown(keyCode, event);
}

【讨论】:

    【解决方案4】:

    试试这些。刚刚对它们进行了测试:

    @Override
    public boolean onKeyLongPress(int keyCode, KeyEvent event) {
        super.onKeyLongPress(keyCode, event);
        if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
            Log.w("LightWriter", "I WORK BRO.");
            return true;
        }
        return false;
    }
    
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        super.onKeyDown(keyCode, event);
        if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
            Log.w("LightWriter", "I WORK BRO.");
            return true;
        }
        return true;
    }
    

    【讨论】:

    • @Sergery 你能告诉我当设备被锁定时它是如何工作的
    • @Abhishek 我从来没有这样做过......但我的理解/猜测是:当屏幕锁定时,您的应用程序需要运行权限(stackoverflow.com/a/11546168/2801237)和/或可能需要设置接收关键事件的广播接收器(可能是其中之一(并且它“可能”改变使用的设备)developer.android.com/reference/android/media/AudioManager.html)(抱歉含糊不清(我通常在 ContentProviders、Services、IPC 等方面工作),但希望这有助于引导正确的道路)
    • onKeyLongPress() 对我不起作用。但是 onKeyDown() 有效。似乎取决于设备。
    • 好的,我知道问题出在哪里。我不得不在 onKeyDown() 中调用 event.startTracking()。之后调用了 onKeyLongPress()。
    【解决方案5】:

    使用此代码处理音量键事件

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        super.onKeyUp(keyCode, event);
        if (keyCode == KeyEvent.KEYCODE_VOLUME_UP)
        {
            Toast.makeText(MainActivity.this,"Up working",Toast.LENGTH_SHORT).show();
            return true;
        }
        return false;
    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        super.onKeyDown(keyCode, event);
        if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)
        {
            Toast.makeText(MainActivity.this,"Down working",Toast.LENGTH_SHORT).show();
            return true;
        }
        return false;
    }
    

    【讨论】:

    • 虽然这可能有效,但我认为这种方法是错误的。如果您查看文档,当按下 ANY 按钮时会调用 onKeyDown,当按下 ANY 按钮时会调用 onKeyUp。您可以在其中一个中同时处理KeyEvent.KEYCODE_VOLUME_UPKeyEvent.KEYCODE_VOLUME_DOWN
    猜你喜欢
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 2013-06-20
    • 2016-10-02
    • 1970-01-01
    相关资源
    最近更新 更多