8

我正在尝试检测蓝牙设备当前是否使用 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”。有什么我做的不对吗?

4

3 回答 3

3

我相信 jkane001 已经解决了他的问题,所以我希望这个答案对其他人有所帮助。

首先在创建套接字之后

socket = device.createRfcommSocketToServiceRecord(SPP_UUID);

您应通过以下方式启动连接

socket.connect();

之后,您将能够使用检查连接状态socket.isConnected()

由于connect()方法没有阻塞,所以套接字可能还没有连接。我建议使用这样的东西

while(!socket.isConnected() && trial++ < 3){
    try {
        Thread.sleep(300);
    } catch (Exception e) {}
}

顺便说一句,我发现在某些 android 设备上isConnected()总是返回 false。在这种情况下,只需尝试向套接字写入一些内容并检查是否没有异常。

于 2014-07-06T10:19:19.953 回答
3

显然有实现 isConnected() 的设备和/或 Android 版本(即该函数存在并且您可以调用它),但比无用更糟糕,因为它总是返回 false。我的办公桌上有一部运行 Android 4.2.2 的阿尔卡特手机,它表现出这种行为。

我的代码假设它已断开连接,因此杀死了我的连接线程,这让我发疯了很长时间。但是,我删除了 isConnected() 调用并假设它已连接,并且一切正常!除了等待错误并声明连接失效之外,我还没有找到更好的方法来检查有效连接。线程中被阻塞的 read() 最终会失败。

我们有来自该领域的报告听起来相似,并且我们知道版本的 2 个问题设备中的 2 个也在 4.2.2 上。尚未部署修复程序,因此不确定它是否修复了这些情况。

于 2015-02-06T18:51:37.240 回答
0

首先,你为什么要使用反射?!这对我来说是一个危险信号。API 允许您通过蓝牙与另一台设备通信,请参阅此链接,因此您不应使用反射。

connect在调用其方法之前,套接字将始终返回未连接。您的代码似乎获得了套接字,但从未尝试与它建立连接。您首先需要调用此方法

于 2013-02-09T22:06:53.107 回答