web-dev-qa-db-ja.com

android=

私のアプリは通常のヘッドセットで制御できます。それは単に「onKeyDown」をオーバーライドします。しかし、Bluetoothヘッドセットからの重要なイベントはキャプチャされません-なぜですか?または、Bluetoothキーイベントをキャプチャする方法は?

ヘッドセットのボタンを押すと、「log cat」に次のように表示されます。

Bluetooth AT recv(3043): AT+VGS=15
AudioPolicyManagerBase(13654): FM radio recording off
AudioService(2261): sendVolumeUpdate, isKeyguardLocked...Not to update Volume Panel.
VolumePanel(2261): change volume by MSG_VOLUME_CHANGED
VolumePanel(2261): onVolumeChanged(streamType: 6, flags: 0)
VolumePanel(2261): Call setChangeSeekbarColor(false)

メディアボタンアクションも処理しようとしましたが、これは機能しません。私の考えは無料の構成可能なキーマッピングです。ユーザーがアプリのすべてのキー(ハードウェア、メディアボタン、Bluetoothヘッドセット)で聞く「キーの設定」を選択し、ユーザーがキーを押すと、イベント/キーコードが構成に保存されます。

機能していない回答の要約:ボリュームボタンは「VOLUME_CHANGED_ACTION」でキャプチャする必要があります。問題は、このインテントが他のアプリにブロードキャストされ、abortBroadcast()が機能しないことです(「順序付けされた」ブロードキャストでのみ機能します)。別の問題は、ケーブルヘッドセットと電話のキーがonReceive()を2回トリガーする(なぜですか?)Bluetoothヘッドセットが1回トリガーすることです。次の問題は、Bluetoothヘッドセットの3番目のキーです。それは音声コマンドをトリガーします(s-voiceはs3で開始します)、これに関する多くの異なる意図をキャプチャしようとしましたが、このボタンの押下を「受信」できず、理由がわかりません。最後に、すべての種類のボタンをキャプチャし、それらを他のアプリで処理したくない(onKeyDownを使用してtrueを返すなど)。

18
dermoritz

ブロードキャストリスナーを_MEDIA_BUTTON_に追加します。

_<intent-filter Android:priority="<some number>"> 
   <action Android:name="Android.intent.action.MEDIA_BUTTON" /> 
</intent-filter> 
_

ブロードキャストレシーバーを(マニフェストファイルではなく)アプリケーション内に登録する必要があります。それ以外の場合は、Googleミュージックプレーヤーがブロードキャストをキャッチして乗車します。

IntentFilterの優先度は、電話の他のメディアプレーヤーの優先度よりも高くする必要があります)

Bluetoothヘッドセットをサポートするには、マニフェストに_Android.permission.BLUETOOTH_権限を追加します

キーを受け取ったら、abortBroadcast()を使用して手動でブロードキャストを中止する必要があります。

ただし、各アプリが応答している間のみ、優先度とabortBroadcast()は正常に機能します。何かが再生されます。ただし、一部のユーザーは、デフォルトプレーヤーのように、ボタンを押すと「デフォルトプレーヤー」が起動する(または再生を開始する)ことを期待しているため、優先度の高い番号のアプリが意図をアプリに伝えない場合があります。

onReceiveでは、次のコマンドでボタンイベントを取得できます

_KeyEvent key = (KeyEvent) 
intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
_

key.getKeyAction()はボタンが離されたか押されたかを示し、key.getKeyCode()は押されたボタンを示します。

シングルボタンケーブルヘッドセットも処理する場合は、キーコード_KEYCODE_HEADSETHOOK_も考慮してください。

アクティビティのonKeyDownメソッドをオーバーライドし、_KeyEvent.KEYCODE_MEDIA_KEYCODE_pressed_key_を確認します

例えば。

_ boolean onKeyDown(int keyCode, KeyEvent event) { 
            AudibleReadyPlayer abc; 
            switch (keyCode) { 
            case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: 
                    // code for fast forward 
                    return true; 
            case KeyEvent.KEYCODE_MEDIA_NEXT: 
                    // code for next 
                    return true; 
            case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: 
                    // code for play/pause 
                    return true; 
            case KeyEvent.KEYCODE_MEDIA_PREVIOUS: 
                    // code for previous 
                    return true; 
            case KeyEvent.KEYCODE_MEDIA_REWIND: 
                    // code for rewind 
                    return true; 
            case KeyEvent.KEYCODE_MEDIA_STOP: 
                    // code for stop 
                    return true; 
            } 
            return false; 
    } 
_

ボリュームキーの統合例 Android-アプリケーションで使用されるボリュームボタン
これには許可が必要な場合があります

_<uses-permission Android:name="Android.permission.MODIFY_AUDIO_SETTINGS" />
_


または、次のリンクでよりスリムな実装を試すことができます

Androidデベロッパーブログ:リモートコントロールボタンの処理
Android Tales:Add to Headset button support to your Android application

29
Yash Krishnan

チェックアウト この記事 。メディアボタンアクションを使用して同様のものを実装する方法について説明します。

あなたがこの方法で成功せずに歩いたと言ったのは知っていますが、それでも試してみてください。ブロードキャストレシーバーの登録、インテントフィルターの優先順位の設定、およびアクセス許可の追加(すべて記事で説明)に関連する注意事項に注意を向けます。

これがお役に立てば幸いです。

2
Eugene Loy

アクティビティからこれをリッスンする場合は、onKeyDown()を使用して、KEYCODE_MEDIA_PLAY_PAUSEKEYCODE_MEDIA_PLAYおよびKEYCODE_MEDIA_PAUSE post ICS)キーイベントをキャッチします。

また、ブロードキャストレシーバーソリューションが機能するためには、バックグラウンドで他のアプリがインストールされて実行されていないことを確認してください。

これも見てください: Android-BroadcastReceiverでヘッドセットボタンのクリックを登録

1
Slartibartfast