3

デバイスが鳴っている間に、デバイスと既にペアリングされている Bluetooth ヘッドフォンに非常に短いオーディオ ストリーム (通知) をルーティングする方法を特定しようとしています。

いつでもオーディオを再生すると、Bluetooth デバイスにルーティングされますが、問題ありません。しかし、android.intent.action.PHONE_STATE を受信したときにオーディオの再生を開始しようとすると、RINGING 状態でオーディオが期待どおりにルーティングされません。

AudioManager の setBluetoothA2dpOn メソッドが非推奨になっていることがわかりますが、実際に試してみましたが効果がないようです。

MediaRouter オブジェクトを試してみましたが、デバイスの呼び出し中に MediaRouter.getSelectedRoute(MediaRouter.ROUTE_TYPE_LIVE_AUDIO) が Bluetooth デバイスの RouteInfo を指し、AudioManager.isBluetoothA2dpOn が true であることを確認できます。

では、鳴っている瞬間のオーディオルートがなぜこのようになっているのか、誰か教えてもらえますか? そのような場合にオーディオを強制的に Bluetooth デバイスにルーティングする方法はありますか?

[更新] 今日、もう一度試してみたところ、問題の原因である可能性があることがわかりました。android.intent.action.PHONE_STATE の変更を検出する BroadcaseReceiver を作成しました。インテントが受信され、状態が現在鳴っている場合は、AudioManager のモードを確認すると、MODE_NORMAL であることがわかります。しかし、数秒後に電話が実際に鳴り始め、モードが MODE_RINGTONE に変更されます。メソッド setMode(AudioManager.MODE_NORMAL) を使用して手動でモードを設定しようとしても無駄です。MODE_NORMAL に設定した後でも、状態は MODE_RINGTONE のままです。

今、問題の原因は、MODE_RINGTONEモードでは、すべてのストリームが電話スピーカーに向けられており、Androidシステムからモードを変更する方法が提供されていないことだと思います。

4

3 に答える 3

0

電話が鳴っているときに、メディアプレーヤーがBluetooth接続を解放すると思います。Bluetooth オーディオ接続を取得して、取得した接続を介してメディア プレーヤーが再生されるかどうかを確認できます。BluetoothヘッドセットでAndroid RecognizerIntentを使用して、私の答えで私のクラスを使用して、それが機能するかどうかを確認できます。授業中の音声はScoのみです。

于 2013-04-13T23:31:22.223 に答える
0

StartBluetoothSco メソッドの JavaDoc に記載されているとおり:

電話アプリケーションは、電話で SCO 接続を使用する際に常に優先されることに注意してください。電話が通話中にこのメソッドが呼び出された場合、それは無視されます。同様に、アプリケーションが SCO 接続を使用しているときにコールが送受信された場合、アプリケーションの接続は失われ、コールが終了しても自動的に返されません。`

sco を起動して通常モードでミュージック クリップを再生しようとしましたが、問題なく Bluetooth ヘッドセットで再生されましたが、入力ストリームがヘッドセットで再生される原因となったマイクを停止することはできませんでした。次に、音楽がまだ再生されている間に別の電話からターゲットの電話に電話をかけようとしましたが、ストリームが電話のスピーカーに自動的にリダイレクトされていることがわかりました. 呼び出しモードが終了した後、ストリームは Bluetooth ヘッドセットに再度リダイレクトされませんでした。上記の JavaDoc に記載されている内容によると、動作は正常であると思います。

私の推測では、アプリケーションからの不要な干渉を許可しないために、Android は呼び出しモードと通話モードを可能な限り保護しようとしています。つまり、呼出しモードでは、呼び出しが受け入れられるまでヘッドセットにサウンドが再生されず、AudioManager モードを呼出しモードから別のモードに変更することさえできず、モード セッターの呼び出しは無視されます。

于 2013-04-16T20:07:49.650 に答える