我正在尝试检测蓝牙设备当前是否使用API 14或更高版本连接到Android设备。看起来我应该能够使用BluetoothSocket.isConnected()方法,但无论我做了什么,到目前为止,我只是因为任何事情而得到错误,无论是否连接。
AndroidManifest包括以下几行:
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- Locale 4.x supports API 14 or greater. -->
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" />
<uses-feature android:name="android.hardware.bluetooth" />
有问题的代码:
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
for (BluetoothDevice device : pairedDevices) {
Log.i(Constants.LOG_TAG, String.format(Locale.US, "Device: %s connected: %b", device.getName(), isConnected(device))); //$NON-NLS-1$z
}
}
private boolean isConnected(BluetoothDevice device) {
BluetoothSocket socket = null;
// Get a BluetoothSocket for a connection with the given BluetoothDevice
UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
try {
socket = device.createRfcommSocketToServiceRecord(SPP_UUID);
} catch (IOException e) {
Log.e(Constants.LOG_TAG, e.getMessage()); //$NON-NLS-1$z
return false;
}
Log.i(Constants.LOG_TAG, socket.toString()); //$NON-NLS-1$z
return socket.isConnected();
}
不会抛出任何错误,它只会在100%的时间内返回“false”。有什么东西我做得不对吗?
答案 0 :(得分:2)
我相信jkane001已经解决了他的问题,所以我希望这个答案可以帮助别人。
首先创建套接字
socket = device.createRfcommSocketToServiceRecord(SPP_UUID);
你应该通过
初始化连接socket.connect();
之后,您将能够使用socket.isConnected()
由于connect()
方法没有阻塞,所以在socket之后可能还没有连接。我建议使用这样的东西
while(!socket.isConnected() && trial++ < 3){
try {
Thread.sleep(300);
} catch (Exception e) {}
}
顺便说一下,我发现在某些Android设备isConnected()
上总是返回false。在这种情况下,只需尝试将某些内容写入套接字并检查是否没有异常。
答案 1 :(得分:2)
显然有些设备和/或Android版本中实现了isConnected()(即函数存在且你可以调用它),但比无用更糟糕,因为它总是返回false。我在我的桌面上安装了一台运行Android 4.2.2的阿尔卡特手机,它表现出这种行为。
我的代码假设它已断开连接,因此杀死了我的连接线程,这让我疯狂很长一段时间。但是,我删除了isConnected()调用并假设它已连接,一切正常!我没有找到更好的方法来检查有效的连接,而不是等待错误并声明连接已死。线程中被阻塞的read()最终会失败。
我们有来自该领域的声音类似的报告,我们知道该版本的2个问题设备中的2个也在4.2.2上。尚未部署修复程序,因此不确定它是否已修复这些情况。
答案 2 :(得分:0)
首先,你为什么要用反射?!那对我来说是个红旗。 API允许您通过蓝牙与其他设备通信,请参阅this link,这样您就不应该使用反射。
在调用connect
方法之前,套接字将始终返回未连接状态。您的代码似乎获得了套接字,但从未尝试与它建立连接。您首先需要致电this method。