我正在研究一个有趣的项目,该项目涉及通过智能手机通过蓝牙混合流音频,从android开始,因为这是我最有经验的项目。 我曾经在android上使用过蓝牙一两次,根据我的经验,我知道蜂窝前API不允许应用程序连接到A2DP或HFP音频接收器。 我已经在HTC EVO的Ginger Bread上进行了尝试,使用了必要的UUID无济于事。

根据官方文档,从API LEVEL 11开始 ,这已经成为可能,但是我可以肯定,唯一提供此API级别的设备将是稍后的Ice Cream Sandwich设备,因为仅在Honey Comb中才开始支持。 我是一个业余爱好者,所以我不太可能很快就使用开发级的Ice Cream Sandwich设备。 因为我现在只是想证明概念,所以将任何代码修改为以后的版本都不会成为问题。

理想情况下,我想使用成对的A2DP设备的输入/输出流直接读取和写入PCM数据。 但是,如果我现在想执行此操作,则很有可能必须使用一种解决方法。

我的想法是使用android的AudioRecordAudioTrack类,根据我的理解, 这些类从麦克风读取音频输入并将音频输出推送到扬声器。 现在,在两种情况下,当未连接A2DP设备时,这些结构将分别使用设备的麦克风和扬声器。 但是,当连接A2DP或HFP设备时,我不知道系统现在是否将这些结构分别设置为输入和输出到耳机的麦克风和扬声器。 如果是这样,那么我可以将其有效地纳入我的代码中,并在以后进行修改以利用Ice Cream Sandwich的直接支持。

在这一领域具有相对丰富经验的人是否认为这种方法行得通? 在我坐下来编写可能会浪费时间的代码之前,我宁愿知道是否有人成功。

===============>>#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)即可

由于蓝牙堆栈已完全更改, 因此无法在Android 4.2上使用

  ask by Joey Carson translate from so

未解决问题?本站智能推荐: