1

私はスマートフォン用の Bluetooth 経由でストリーミング オーディオをミキシングすることを含む興味深いプロジェクトを研究しています。それは私が最も経験を積んでいるので、Android から始めます。私はAndroidでBluetoothを1、2回使用しましたが、私の経験では、ハニカム以前のAPIではアプリケーションがA2DPまたはHFPオーディオシンクに接続できないことがわかりました。必要なUUIDを使用して、HTC EVOのジンジャーブレッドでこれをすでに試しましたが、役に立ちませんでした。

公式ドキュメントによると、API LEVEL 11の時点でこれが可能になりましたが、サポートが Honey Comb でのみ開始されたため、この API レベルを提供する唯一のデバイスは、後で Ice Cream Sandwich デバイスになると確信しています。私は完全なアマチュアなので、すぐに開発グレードの Ice Cream Sandwich デバイスにミットを取り付けることはできそうにありません。私は今、概念を証明しようとしているだけなので、後のリビジョンにコードを適応させることは問題ではありません。

理想的には、ペアリングされた A2DP デバイスの入力/出力ストリームを使用して、PCM データを直接読み書きしたいと考えています。ただし、今すぐこれを行いたい場合は、回避策を使用する必要があります。

私の考えは、私の理解によれば、マイクからオーディオ入力を読み取り、オーディオ出力をスピーカーにプッシュする、 AndroidのAudioRecordおよびAudioTrackクラスを使用することです。どちらの場合も、A2DP デバイスが接続されていない場合、これらの構造はデバイスのマイクとスピーカーをそれぞれ使用します。ただし、A2DP または HFP デバイスが接続されている場合、システムがこれらの構造体をそれぞれの入力と出力をヘッドセットのマイクとスピーカーに設定するかどうかはわかりません。もしそうなら、これを効果的にコードに組み込み、後で調整して Ice Cream Sandwich の直接サポートを利用することができます。

この分野で比較的豊富な経験を持つ人で、このアプローチがうまくいくと思う人はいますか? 座って時間の無駄になる可能性のあるコードを書く前に、誰かが成功したかどうかを知りたいです。

4

1 に答える 1

0

実際、Android には a2dp デバイスを接続するための公式 API がありません。

ただし、リフレクションを使用して隠しクラスにアクセスできます。私は自分のプロジェクトでこの方法を使用しましたが、Android 2.3 から Android 4.1 まで動作します。

まず、IBluetoothA2dp.aidl ファイルを取得し、プロジェクト フォルダーsrc/com.android
に配置する必要があります。 次に、以下のメソッドを使用して IBluetoothA2dp インターフェイスを取得します。

private static IBluetoothA2dp getIBluetoothA2dp() {
    IBluetoothA2dp ibta = null;

    try {
        final Class serviceManager = Class.forName("android.os.ServiceManager");
        final Method getService = serviceManager.getDeclaredMethod("getService", String.class);
        final IBinder iBinder = (IBinder) getService.invoke(null, "bluetooth_a2dp");
        final Class iBluetoothA2dp = Class.forName("android.bluetooth.IBluetoothA2dp");
        final Class[] declaredClasses = iBluetoothA2dp.getDeclaredClasses();
        final Class c = declaredClasses[0];
        final Method asInterface = c.getDeclaredMethod("asInterface", IBinder.class);

        asInterface.setAccessible(true);
        ibta = (IBluetoothA2dp) asInterface.invoke(null, iBinder);
    } catch (final Exception e) {
        Log.e("Error " + e.getMessage());
    }
    return ibta;
}

次に、SDK < 11 の場合、SDK が 11 から 16 の場合はa2dp.connectSink(btDevice)またはa2dp.connect(btDevice ) を呼び出します。Bluetoothスタックが完全に変更されているため、

Android 4.2 では機能しません。

于 2013-02-07T14:59:30.713 に答える