【发布时间】:2014-04-09 05:03:43
【问题描述】:
在我们的应用中,我想使用 Android v4.2 或更高版本连接到之前配对的 A2DP 蓝牙扬声器并直接播放音频。
我可以使用此代码成功创建 A2DP 配置文件对象以启动该过程:
/* Manifest permissions */
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
// Get the default adapter
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
// Establish connection to the proxy.
mBluetoothAdapter.getProfileProxy(this, mProfileListener, BluetoothProfile.A2DP)
和下面的监听器响应连接:
private BluetoothProfile.ServiceListener mProfileListener = new BluetoothProfile.ServiceListener() {
public void onServiceConnected(int profile, BluetoothProfile proxy) {
if (profile == BluetoothProfile.A2DP) {
mBluetoothSpeaker = (BluetoothA2dp) proxy;
// no devices are connected
List<BluetoothDevice> connectedDevices = mBluetoothSpeaker.getConnectedDevices();
//the one paired (and disconnected) speaker is returned here
int[] statesToCheck = {BluetoothA2dp.STATE_DISCONNECTED};
List<BluetoothDevice> disconnectedDevices = mBluetoothSpeaker.getDevicesMatchingConnectionStates(statesToCheck);
BluetoothDevice btSpeaker = disconnectedDevices.get(0);
//WHAT NOW?
}
}
public void onServiceDisconnected(int profile) {
if (profile == BluetoothProfile.A2DP) {
mBluetoothSpeaker = null;
}
}
};
我只是有点不知道现在该做什么,连接设备,并将音频输出定向到它。我尝试使用以下代码连接到设备as detailed in the Android docs,但最终的BluetoothSpeaker.getConnectedDevices() 调用未返回任何连接的设备。
BluetoothSocket tmp = null;
UUID MY_UUID = UUID.fromString("00001108-0000-1000-8000-00805f9b34fb");
try {
tmp = btSpeaker.createInsecureRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e1) {
// TODO Auto-generated catch block
Log.d("createRfcommSocketToServiceRecord ERROR", e1.getMessage());
}
mmSocket = tmp;
try {
// Connect the device through the socket. This will block
// until it succeeds or throws an exception
mmSocket.connect();
} catch (IOException connectException) {
// Unable to connect; close the socket and get out
try {
Log.d("connectException", connectException.getMessage());
mmSocket.close();
} catch (IOException closeException) { }
return;
}
connectedDevices = mBluetoothSpeaker.getConnectedDevices();
代码似乎确实以某种方式连接到设备,因为当我停止执行时,蓝牙扬声器会宣布它已准备好配对(就像它与音频源断开连接时一样)。
BluetoothA2dp 的旧版本似乎有一个 connect(BluetoothDevice device) 方法,但现在已被删除(从 4.2 开始),我正在努力寻找如何以编程方式连接到 A2DP 设备的任何明确示例,并将音频输出定向到它。我们将不胜感激地收到任何有关如何接近的帮助。
任何有关如何解决此问题的建议将不胜感激。
【问题讨论】:
-
我假设您正在创建您的
mProfileListener实例之前调用getProfileProxy(...)? -
是的,
onServiceConnected块很高兴地触发。 -
这个问题的答案stackoverflow.com/questions/12542523/… 和上面的 cmets 似乎并不乐观。
-
感谢 Squonk,我可以通过调用
createInsecureRfcommSocketToServiceRecord()来连接设备(或至少触发BluetoothDevice.ACTION_ACL_CONNECTED事件),但如果该帖子是正确的,那么 RFcomm 无论如何对于 A2DP 广播都是错误的.连接到 A2DP 设备的正确方法是什么? Android 蓝牙文档中似乎有一个巨大的漏洞(或者至少我对它的理解)。 -
老实说,我不知道,因为我从未尝试过 A2DP,但我同意文档中存在差距。 A2DP 有一些选项,但没有使用它的有用方法(或者至少没有解释如何使用它的有用文档),这似乎很奇怪。如果我遇到任何事情,我会回复你。
标签: java android bluetooth android-bluetooth a2dp