Java 监听按键事件会阻止按键工作
我是android新手,我正在制作一款应用程序,它可以连续按上下音量键,并振动一个模式 我尝试过使用dispatchKeyEvent(),它可以很好地检测音量的上升和下降,但它会阻止用户更改音量Java 监听按键事件会阻止按键工作,java,android,Java,Android,我是android新手,我正在制作一款应用程序,它可以连续按上下音量键,并振动一个模式 我尝试过使用dispatchKeyEvent(),它可以很好地检测音量的上升和下降,但它会阻止用户更改音量 public boolean dispatchKeyEvent(KeyEvent event) { int action = event.getAction(); int keyCode = event.getKeyCode(); switch (keyCode) {
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) {
System.out.println("UP"); // I know i can use Log but this is quicker to type
}
return true;
case KeyEvent.KEYCODE_VOLUME_DOWN:
if (action == KeyEvent.ACTION_DOWN) {
System.out.println("DOWN");
}
return true;
default:
return super.dispatchKeyEvent(event);
}
}
此外,我希望能够在屏幕关闭(应用程序在后台)时执行此操作,但服务无法与关键事件交互
我发现到处都是相互矛盾的答案;我以前使用的一个应用程序在后台播放声音,屏幕关闭,电源按钮连续按下3次,但这里的许多问题都有类似于“不可能”的答案
我不介意使用电源按钮而不是音量键(事实上两者都很好),但这似乎更难实现
TLDR:
super.dispatchKeyEvent(事件)代码>否则,如果返回true代码>这意味着您消费了事件,没有人会知道事件
如何在后台运行
我认为,这是不可能的。Android有一项服务,可以做后台工作,但这不是处理系统按钮点击的方式 覆盖活动的onKeyDown()
更容易;因为它总是KeyEvent.ACTION\u DOWN
:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP: {
System.out.println("UP");
}
case KeyEvent.KEYCODE_VOLUME_DOWN: {
System.out.println("DOWN");
}
}
return super.onKeyDown(keyCode, event);
}
嗨,谢谢你的回答,你的回答阻止了它挡住钥匙。至于在后台运行,我以前见过这样做的应用程序,但“不可能”似乎是这个问题最常见的答案。“真是莫名其妙!”大卫说。可能会改变方式。@Dimitro Ivanov我有一个模式,我想在屏幕关闭时振动(当屏幕关闭时,应用程序可以在后台),用户可以通过组合音量键或按电源键来触发它。@DavidPH如你所知,一个音量键和电源键已经由Android操作系统处理。这不是常见的问题,但请继续。快乐编码@DavidPH在这里还解释道:……您没有听“按键事件”(如标题所述),而是听按键发送事件。重写框架的类并调用/返回super()
类的over riden方法可能会产生最小的副作用。为事件返回true
,意味着它们已经被消耗了,并且不会再冒泡(这可能是期望的或不期望的)。