Java Blackberry | MediaKeyListener中的keyUp和keyDown方法在应用程序处于后台时未调用
我想处理长按(约10秒)音量按钮(音量增大或减小不重要) 因此,我使用了自己的Java Blackberry | MediaKeyListener中的keyUp和keyDown方法在应用程序处于后台时未调用,java,blackberry,java-me,background-process,Java,Blackberry,Java Me,Background Process,我想处理长按(约10秒)音量按钮(音量增大或减小不重要) 因此,我使用了自己的MediaKeyListener private class LoongPressKeyListener extends MediaKeyListener { public boolean mediaAction(int action, int source, Object paramObject) { System.out.println("::: action="
MediaKeyListener
private class LoongPressKeyListener extends MediaKeyListener {
public boolean mediaAction(int action, int source,
Object paramObject) {
System.out.println("::: action=" + action + ";source=" + source + ";object=" + paramObject);
}
public boolean keyDown(int keycode, int status) {
switch (Keypad.key(keycode)) {
case Keypad.KEY_VOLUME_UP:
case Keypad.KEY_VOLUME_DOWN:
System.out.println("volume keyDown");
return true;
default:
return super.keyDown(keycode, status);
}
}
public boolean keyUp(int keycode, int status) {
switch (Keypad.key(keycode)) {
case Keypad.KEY_VOLUME_UP:
case Keypad.KEY_VOLUME_DOWN:
System.out.println("volume keyUp");
return true;
default:
return super.keyUp(keycode, status);
}
}
}
但由于某些原因,keyUp
和keyDown
方法只有在应用程序位于前台时才被调用<代码>mediaAction仅在应用程序处于后台时调用
有人能解释一下这是正确的行为吗?是否可以在后台处理长时间的音量按钮按下?您看到的是正确的行为,但是您仍然可以在后台处理音量上升/下降事件。从BlackBerry文档中获取: 应用程序将创建这个类的一个具体子类 实现MediaActionHandler中定义的方法。然后,一个 该类的实例可以通过以下方式注册为KeyListener 使用Application.addKeyListener()或Screen.addKeyListener(),其中 将在应用程序运行时处理媒体按键 前景。然后,可以创建相同的MediaKeyListener实例 使用Application.addMediaActionHandler()注册,以便 在后台响应媒体按键,以及媒体 其他来源的行动 因此,您需要确保调用,以添加您的
LongPressKeyListener
实例
另外,从MediaActionHandler
class API文档:
后台按键的媒体操作
如果MediaActionHandler是通过
Application.addMediaActionHandler()则会收到媒体通知
应用程序处于后台时发生的按键操作。如果
恰好位于前台的应用程序使用媒体
按键,则不会将其作为媒体操作发布到媒体操作
处理程序。由后台键生成的mediaAction()调用
按下将有source==MediaActionHandler.source\u BACKGROUND\u键和
上下文==null
下面是一个用于在后台检测音量增大、音量减小和音量过长的示例:
公共类MediaKeyHandler扩展了MediaKeyListener{
公共MediaKeyHandler(){
//使用此选项在后台注册事件:
UiApplication.getUiApplication().addMediaActionHandler(此);
//使用此选项在前台注册事件:
//UiApplication.getUiApplication().addKeyListener(此);
}
公共布尔mediaAction(int操作、int源、对象上下文){
System.out.println(“mediaAction(“+action+”,“+source+”,context)”);
if(source==MediaActionHandler.source\u BACKGROUND\u KEY){
开关(动作){
案例MediaActionHandler.MEDIA\u操作\u音量\u下降:
//手柄音量下降键按下
打破
案例MediaActionHandler.MEDIA\u ACTION\u VOLUME\u UP:
//按手柄音量增大键
打破
案例MediaActionHandler.MEDIA\u操作\u下一个\u轨迹:
//长按手柄音量增大键
打破
案例MediaActionHandler.MEDIA\u ACTION\u PREV\u TRACK:
//长按手柄音量下降键
打破
违约:
打破
}
返回true;//已使用按键
}否则{
//应用程序处于前台时按键,请点击此处
返回false;//未使用按键
}
}
注意:我知道在背景中无法检测到10秒的音量按键。在前景中,
KeyListener#keyRepeat()
和MediaKeyListener#mediaAction()
当您按住按键时,会被反复呼叫,但不是在后台。我上面显示的代码只需长按一秒(不是10秒)即可工作。因此,正如我从您的回答中了解到的,我没有机会处理释放音量按钮(也没有机会处理长按).correct?@CAMOBAP,不幸的是,这是正确的。在后台,您不会收到向上键事件,因此无法判断音量键按下的结束时间。但是,音量键按下事件不同于上一个曲目事件,因此您可以通过收听上一个曲目来处理长时间按下。但是,长时间按下只需1秒,而不是10秒。有关更多信息,请参阅我的答案更新。我无法用语言表达我对你的感谢!)你的答案总是详细的,并有文档支持。非常感谢!!!@CAMOBAP,你太好了!不客气,祝你的应用程序好运!