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 ドキュメントから:

バックグラウンドでのキー押下によるメディア アクション

MediaActionHandler が Application.addMediaActionHandler() を介して登録されている場合、アプリケーションがバックグラウンドにある間に発生したメディア キーの押下が通知されます。たまたまフォアグラウンドにあるアプリケーションがメディア キーの押下を消費した場合、それはメディア アクション ハンドラーへのメディア アクションとして通知されません。バックグラウンド キーの押下による 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 秒間の音量キーの押下を検出する方法はありません。フォアグラウンドでは、キーを押し続けると と の両方が繰り返し呼び出されますが、バックグラウンドでは呼び出されません。上記のコードは、約 1 秒 (10 秒ではありません) の長押しで機能します。KeyListener#keyRepeat()MediaKeyListener#mediaAction()

于 2013-07-06T22:11:45.760 に答える