いいえ。これを処理する Android アプリケーションを作成しようとしても解決にはなりません。A2DP Sink
少なくともロールを使用する場合
BlueZ
実際のところ、あなたが言及したように、Android は機能に関する API 呼び出し (Android が Jelly Bean 4.1 まで使用する Bluetooth スタック)を実装していませんA2DP sink
。それらを自分で実装する必要があります。私も近い過去に自分でこれを行うことに興味があったので、私はあなたを案内しようとします.
Bluetooth 対応の Android デバイスはA2DP source
、デフォルトでそれ自体をデバイスとしてアドバタイズしています。近くのデバイスがあなたのデバイスをシンクとして認識できるように、最初にこれを変更する必要があります。これを行うには、audio.confファイル (通常は/etc/bluetooth/Enable
にあります) を変更し、キーが存在し、値がこのキーに関連付けられていることを確認する必要がありSource
ます。これにより、次のような結果が得られます。
Enable=Source
再起動すると、近くのデバイスがあなたのデバイスをA2DP sink
.
ここで、A2DP ソース デバイスが音声を電話にストリーミングし始めたときに適切に対応するために、BlueZ と対話する必要があります。
Android と BlueZ は を介して互いに通信していD-BUS
ます。実際、Android は DBUS_SYSTEM チャネルに接続し、イベント、ファイル記述子などのすべての BlueZ 広告をリッスンします...
ネイティブ アプリケーションを使用して自分自身をこの d-bus チャネルにバインドすることに成功し、BlueZ が投稿したさまざまなイベントにアクセスできたことを覚えています。これは、こちらから入手できる BlueZ API を参照として使用すると、比較的簡単に実現できます。この方法では、ネイティブ アプリケーション (C/C++) をビルドし、プラットフォーム用にコンパイルする必要があります。を使用してこれを実行できる必要がありますAndroid NDK
。
使いにくい場合はD-BUS
、D-BUS への通信を処理する Java ライブラリを試してみてください: http://jbluez.sourceforge.net/ . 私はそれを使用したことはありませんが、私の意見では試してみる価値があります。
あなたが本当にしなければならないことは、いつ A2DP ソース デバイスがあなたの携帯電話にペアリングされ、いつ彼が音楽のストリーミングを開始するかを調べることです。これらのイベントは、D-BUS を介して取得できます。誰かが音楽をストリーミングしようとすると、ネイティブ アプリケーションがそれを処理することを BlueZ に伝える必要があります。これを行うために処理する必要があるイベントの流れを説明する非常に優れたドキュメントがあります。このドキュメントは、ここからアクセスできます。関心のある部分は 7 ページにあります。この例のシンク アプリケーションは、PulseAudio
あなたのアプリケーションである可能性もあります。
メソッドを呼び出すと、BlueZ は UNIX ソケットを転送しますorg.bluez.MediaTransport.Acquire
。このソケットを読み取ると、リモート デバイスによって現在ストリーミングされているデータが得られます。しかし、BlueZ スタックに取り組んでいる人から、このソケットで読み取られるデータは PCM の純粋なオーディオではなく、エンコードされたオーディオ コンテンツであると言われたことを覚えています。SBC
データは一般に(Low Complexity Subband Coding)と呼ばれる形式でエンコードされます。
SBC のデコードはそれほど難しくありません。ここでデコーダを見つけることができます。
最終的なステップは、PCM オーディオをスピーカーに転送することです。
行き詰まるのを防ぎ、簡単な方法でアプリケーションをテストするためにd-bus
、Android システムで利用できるはずのバイナリを使用できます。彼は/system/binにあります。
上記のことを行う前に行うことができる簡単なテストは次のとおりです。
デバイス リストを取得します。
dbus-send --system --dest=org.bluez --print-reply / org.bluez.Manager.GetProperties
これは、アダプターの配列とそのパスを返します。これらのパスを取得したら、アダプターとペアになっているすべての Bluetooth デバイスのリストを取得できます。
ペアリングされたデバイスを取得します:
dbus-send --system --print-reply --dest=org.bluez /org/bluez/{pid}/hci0 org.bluez.Adapter.GetProperties
これにより、Devices 配列フィールド内にペアリングされたデバイスのリストが表示されます。
Bluetooth アダプターにペアリングされたデバイスのリストを取得したら、それが AudioSource インターフェイスに接続されているかどうかを確認できます。
AudioSource インターフェイスに接続されているデバイスを取得します。
dbus-send --system --print-reply --dest=org.bluez /org/bluez/{pid}/hci0/dev_XX_XX_XX_XX_XX_XX org.bluez.AudioSource.GetProperties org.bluez.Manager.GetProperties
お役に立てれば。