Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Blackberry | MediaKeyListener中的keyUp和keyDown方法在应用程序处于后台时未调用_Java_Blackberry_Java Me_Background Process - Fatal编程技术网

Java Blackberry | MediaKeyListener中的keyUp和keyDown方法在应用程序处于后台时未调用

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="

我想处理长按(约10秒)音量按钮(音量增大或减小不重要)

因此,我使用了自己的
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,你太好了!不客气,祝你的应用程序好运!