2

Froyo で Intent.ACTION_MEDIA_BUTTON を処理するための正しい (新しい) アプローチを見つけようとしています。2.2 日前には、BroadcastReceiver を (永続的または実行時に) 登録する必要があり、他のアプリケーションがそれらをインターセプトしてブロードキャストを中止しない限り、メディア ボタン イベントが到着していました。

Froyo はまだそのモデルをある程度サポートしているようですが (少なくとも有線ヘッドセットの場合)、アプリケーション間の「トランスポート フォーカス」を制御するように見える registerMediaButtonEventReceiver メソッドと unregisterMediaButtonEventReceiver メソッドも導入されています。

私の実験では、registerMediaButtonEventReceiver を使用すると、Bluetooth と有線のヘッドセット ボタンの両方の押下がアプリケーションのブロードキャスト レシーバーにルーティングされます (アプリは「トランスポート フォーカス」を取得します)。ヘッドセット) は、フォーカスをデフォルトのメディア プレーヤーに戻します。

Android 2.2 での実装の背後にあるロジックは何ですか? トランスポート コントロールを処理する正しい方法は何ですか? オーディオ ルーティングの変更を検出して、フォーカスを取り戻す必要がありますか?

これは、Android プラットフォーム上のすべてのサードパーティ メディア プレーヤーが対処しなければならない問題であるため、誰か (おそらく Google エンジニア) が、私たち全員が従うことができるガイドラインを提供してくれることを願っています。標準的なアプローチを採用することで、ヘッドセットのボタン制御がエンド ユーザーにとってより予測しやすくなる場合があります。

ステファン

4

3 に答える 3

2

Google は、古いデバイスとの下位互換性を維持しながら、新しい 2.2 AudioManager メディア ボタン イベント レシーバーを実装することに関する詳細なブログ投稿を公開しています。

http://android-developers.blogspot.com/2010/06/allowing-applications-to-play-nicer.html

于 2010-12-10T14:21:03.630 に答える
1

いくつかの実験の後、Android 2.2 の新しいトランスポートおよびオーディオ フォーカス インフラストラクチャを使用した実用的なソリューションを得ることができました。

私がやっていることは、アプリケーションが再生を開始するたびに、Audio Focus (AudioManager.requestAudioFocus を使用) と Trasport Focus (AudioManagter.registerMediaButtonEventReceiver を使用) の両方を要求することです。

requestAudioFocus は、オーディオ フォーカスがユーザーから離れたときに呼び出されるコールバックを受け取ります (たとえば、内部プレーヤーが再生を開始するなど)。私の場合、フォーカスが永続的に取得された場合、アプリケーションで再生を一時停止します。同じコールバックも、フォーカスが一時的なもの (たとえば、ナビゲーション システムが話している) に過ぎないことを通知するようになったため、再生を「ダッキング」することができます。音量を下げるか、一時停止し、話し終わったら再開します。

残っている唯一の問題は、Bluetooth ヘッドセットを接続するたびに、組み込みのミュージック プレーヤーがトランスポート フォーカスを取得することです。これにより、接続後にヘッドセットの再生ボタンを最初に押すと、常にデフォルトの音楽プレーヤーで再生が開始されます。

おそらく、ヘッドセットの接続を検出し、トランスポート フォーカスを「ハイジャック」する方法があります。私の場合、デフォルトのプレーヤーと「戦う」ことはせず、ユーザーがアプリケーションで手動で再生を開始したときにトランスポート フォーカスを戻すことにしました。

誰かがトランスポート/オーディオフォーカスを処理するより良い方法を知っているか知っている場合は、それを共有してください.

于 2010-05-27T12:49:27.267 に答える
0

メディアボタンの登録にも同じ問題があります。

Android は定期的にメディア ボタンの登録をデフォルトの音楽プレーヤーに戻します。私は理由を理解することができませんでした。これは、多くのアプリケーションがアクティブに再生されているときと、アプリケーションの再生が一時停止しているときに発生する可能性があります。

Bluetooth の一時停止ボタンと再生コントロール ボタンが定期的に機能しなくなり、アプリケーションを制御できないと多くのユーザーから苦情が寄せられたため、2 秒ごとに registerMediaButtonEventReceiver を呼び出してアプリケーションを再登録するコードを実装しました。これにより、ボタンの登録を元に戻すことができ、ほとんどの場合、ユーザーが Bluetooth メディア ボタンを押したときにデフォルトのメディア プレーヤーが応答する時間枠を回避できます。

私のアプリケーションは、この期間全体でオーディオ フォーカスを保持していますが、オーディオ フォーカスがある間は定期的に Bluetooth ボタン イベントを失います。私のアプリケーションは、オーディオ フォーカスを失っているという通知で呼び出された場合、常にメディア ボタン イベント レシーバーの登録を解除し、一時的なオーディオ フォーカスの喪失によってオーディオ フォーカスが返されたときに後で呼び出された場合は、再度登録します。

2 秒タイマーの実行と再登録を維持するための回避策は機能していますが、誰かがメディア ボタンの登録を定期的にデフォルトのメディア プレーヤーに切り替える回避策を見つけた場合は、この 2 秒タイマーを削除したいと思います。 .

于 2011-09-14T06:46:15.580 に答える