我一直在编写代码,以将短的音频消息发送到廉价的蓝牙听筒。
我希望能够使用A2DP选择当前的音频输出设备,而且似乎没有任何可靠的方法。
我知道如何获取A2DP配置文件,以及如何使用反射来连接和断开设备。
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
public BluetoothA2dp mA2DP;
mBluetoothAdapter.getProfileProxy(this, mProfileListener, BluetoothProfile.A2DP);
private BluetoothProfile.ServiceListener mProfileListener = new BluetoothProfile.ServiceListener() {
public void onServiceConnected(int profile, BluetoothProfile proxy) {
if (profile == BluetoothProfile.A2DP) {
mA2DP = (BluetoothA2dp) proxy;
}
}
@Override
public void onServiceDisconnected(int profile) {
if (profile==BluetoothProfile.A2DP) {
mA2DP = null;
}
}
};
通过A2DP配置文件,您可以使用反射来访问连接和断开连接方法:
public void disconnectA2DP(BluetoothDevice bd) {
if (mA2DP==null) return;
try {
Method m = BluetoothA2dp.class.getDeclaredMethod("disconnect", BluetoothDevice.class);
m.invoke(mA2DP,bd);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
(连接与方法名称的使用“连接”相同,但相同)
一切正常。然后,您可以使用GetConnectedDevices来查找当前已连接的设备。
较旧的电话似乎仅支持一个设备,因此此机制可以很好地切换输出。但是,以后的手机(特别是三星)似乎同时支持两个设备。似乎没有任何方法选择音频要去的设备。我可以断开不需要的设备,但是有些设备有一个烦人的习惯,即无需询问即可重新连接,并使其成为活动输出。
在BluetoothA2dp的源代码中,您可以清楚地看到“ setActiveDevice”,但即使通过反射,应用程序似乎也无法访问它。
任何帮助表示赞赏。
编辑:部分混乱的解决方案:根据经验,设备列表中的最后一个BluetoothDevice是活动的。如果不是我想要的那一个,我断开列表中的第一个,然后连接我想要的那一个。这似乎可行,但并没有使我成为最佳解决方案。