【问题标题】:Android BluetoothSocket.isConnected always returns falseAndroid BluetoothSocket.isConnected 总是返回 false
【发布时间】:2015-02-07 02:51:37
【问题描述】:

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

【问题讨论】:

    标签: android api bluetooth


    【解决方案1】:

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

    首先在socket创建之后

    socket = device.createRfcommSocketToServiceRecord(SPP_UUID);
    

    你应该通过

    初始化连接
    socket.connect();
    

    之后您就可以使用socket.isConnected()检查连接状态

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

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

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

    【讨论】:

    • 我发现由于信号差导致连接丢失后,如果调用isConnected(),它仍然返回True。所以我求助于向套接字发送一些东西并捕获异常。
    • @VectorVictor 正确。 isConnected() 不是检查连接是否有效的可靠方法。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 反射部分来自这个问题的公认答案:stackoverflow.com/questions/3397071/…。我对反射的想法并不感到兴奋,但我想我记得在其他地方读过你不应该依赖原始问题中的 UUID。话虽如此,对我来说重要的问题是您答案的第二部分-我正在尝试查找已连接的任何 BT 设备,而不是尝试自己连接任何设备。那不可能吗?我试图避免必须创建一个服务来监控 BT 状态变化。
      • Ameen 是对的,在仔细阅读了 SO 答案和 Android 文档之后,我意识到这里不需要反思。我已经用更好的“isConnected”方法更新了我的原始问题,但我的问题仍然存在:有没有一种方法可以检测 BT 设备是否已连接而不是连接它的那个?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多