我正在研究一个有趣的项目,涉及到智能手机通过蓝牙混合流媒体音频,从android开始,因为这是我最有经验的。我曾经在android上使用过蓝牙技术一两次,在我的经验中,我已经了解到,预蜂窝API不允许应用程序连接到A2DP或HFP音频接收器。我已经在HTC EVO的生姜面包上尝试了这一点,使用必要的UUID却没有效果。
根据官方文档,从空气污染指数11级的角度来看,这是可能的,但我非常肯定,提供这个API级别的唯一设备将是稍后的冰激凌三明治设备,因为支持只是在蜂窝中才开始的。我是一个完全的业余爱好者,所以我不太可能在任何时候得到我的手套在开发级冰淇淋三明治设备。为以后的修订修改任何代码都不是问题,因为我现在只想证明概念。
理想情况下,我希望使用成对A2DP设备的输入/输出流直接读写PCM数据。然而,如果我现在想这样做,我将很可能不得不使用一个解决办法。
我的想法是使用android的AudioRecord和AudioTrack类,根据我的理解,这些类读取麦克风的音频输入,并将音频输出推到扬声器。在这两种情况下,当A2DP设备没有连接时,这些结构将分别使用设备的麦克风和扬声器。然而,当连接A2DP或HFP设备时,我不知道系统现在是否会将这些结构分别设置为耳机的麦克风和扬声器。如果是这样的话,那么我可以在我的代码中有效地使用它,并在以后对它进行调整,以利用冰激凌三明治中的直接支持。
是否有人在这方面有较强的经验,认为这种方法会奏效?在我坐下来写一些可能会浪费时间的代码之前,我宁愿知道是否有人成功了。
发布于 2013-02-07 14:59:30
实际上,安卓并没有官方的API来连接a2dp设备。
但是您可以使用反射来访问隐藏类。我在我的项目中使用了这种方法,它从Android2.3到Android4.1都能工作。
首先,您需要获取IBluetoothA2dp.aidl文件并将其放入项目文件夹IBluetoothA2dp.aidl中。
接下来,使用下面的方法获取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,只需调用a2dp.connectSink(btDevice)或a2dp.connect(btDevice),如果您的SDK介于11和16之间。
--它不能在Android4.2上工作,因为蓝牙堆栈完全改变了。
https://stackoverflow.com/questions/8467178
复制相似问题