2

我想处理音量按钮的长按(大约 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);
        }
    }
}

但是由于某些原因keyUpkeyDown方法只有在前台应用时才被调用。mediaAction只有当应用程序在后台时才被调用。

有人可以解释这是正确的行为吗?是否可以从后台处理长音量按钮?

4

1 回答 1

2

您看到的是正确的行为,但您仍然可以在后台获取音量增大/减小事件。来自MediaKeyListener的 BlackBerry 文档(粗体是我的) :

应用程序将创建此类的具体子类,以实现 MediaActionHandler 中定义的方法。然后,可以使用 Application.addKeyListener() 或 Screen.addKeyListener() 将该类的实例注册为 KeyListener,这将在应用程序处于前台时处理媒体按键。然后,可以使用 Application.addMediaActionHandler() 注册 MediaKeyListener 的同一实例,以便在后台响应媒体按键以及来自其他来源的媒体操作。

因此,您需要确保调用Application#addMediaActionHandler()来添加您的LoongPressKeyListener实例。

此外,来自MediaActionHandler类 API 文档:

来自后台按键的媒体操作

如果通过 Application.addMediaActionHandler() 注册了 MediaActionHandler,那么它将在应用程序处于后台时收到媒体按键的通知。如果碰巧在前台的应用程序使用媒体按键,则不会将其作为媒体操作发布到媒体操作处理程序。后台按键导致的 mediaAction() 调用将具有 source==MediaActionHandler.SOURCE_BACKGROUND_KEY 和 context==null。

以下是在后台检测音量增大、音量减小和音量长按的示例:

public class MediaKeyHandler extends MediaKeyListener {

    public MediaKeyHandler() {
        // use this to register for events while in the background:
        UiApplication.getUiApplication().addMediaActionHandler(this);
        // use this to register for events while in the foreground:
        //UiApplication.getUiApplication().addKeyListener(this);
    }

    public boolean mediaAction(int action, int source, Object context) {
        System.out.println("mediaAction(" + action + "," + source + ",context)");

        if (source == MediaActionHandler.SOURCE_BACKGROUND_KEY) {
            switch (action) {
            case MediaActionHandler.MEDIA_ACTION_VOLUME_DOWN:
                // handle volume down key pressed
                break;
            case MediaActionHandler.MEDIA_ACTION_VOLUME_UP:
                // handle volume up key pressed
                break;
            case MediaActionHandler.MEDIA_ACTION_NEXT_TRACK:
                // handle volume up key long-pressed
                break;
            case MediaActionHandler.MEDIA_ACTION_PREV_TRACK:
                // handle volume down key long-pressed
                break;
            default:
                break;
            }
            return true;  // keypress consumed
        } else {
            // keypresses while app is in foreground come here

            return false;  // keypress not consumed
        }
    }

注意:我不知道在后台检测10 秒音量键按下的方法。在前台,当您按住键时,两者都被反复调用,但不在后台。我上面显示的代码可以长按大约一秒(不是 10 秒)。KeyListener#keyRepeat()MediaKeyListener#mediaAction()

于 2013-07-06T22:11:45.760 回答