1

我已经构建了一个 android 应用程序,它可以使用 BluetoothSocket.connect() 通过蓝牙(经典蓝牙)连接到外围设备并与之进行一些交互。该应用程序在三星 Galaxy S3(4.3) 和 Note 3(4.3) 上运行良好,但在 Nexus 5 上时,该应用程序无法连接到设备。

我有 2 个 Nexus 5,它们都无法连接,是什么让我认为 Nexus 5 一定有问题,而不是我。但是当我使用设备制造商支持的应用程序连接到设备时,始终可以建立连接,即使使用 Nexus 5。

所以我想,Nexus 5 在经典蓝牙上一定有问题,导致建立连接不太容易,可能有一些方法可以解决它。

抱歉我的英语很差。感谢您提供有关如何解决此问题的任何指示。

这是我的 logcat 信息的 3 个块:

三星 Galaxy S3 的 logcat 信息(已工作):

04-01 17:03:33.340 D/BloodPressureService﹕ connect to: 8C:DE:52:2C:68:6D
04-01 17:03:33.360 D/BluetoothUtils﹕ isSocketAllowedBySecurityPolicy start : device null
04-01 17:03:33.360 W/BluetoothAdapter﹕ getBluetoothService() called with no BluetoothManagerCallback
04-01 17:03:33.360 D/BloodPressureService﹕ setState() 0 -> 1
04-01 17:03:33.365 I/BloodPressureMonitorFragment﹕ MESSAGE_STATE_CHANGE: 1
04-01 17:03:35.095 D/BloodPressureService﹕ connected
04-01 17:03:35.095 D/BloodPressureService$ConnectedThread﹕ create ConnectedThread
04-01 17:03:35.105 I/BloodPressureService$ConnectedThread﹕ BEGIN mConnectedThread
04-01 17:03:35.110 D/BloodPressureService﹕ setState() 1 -> 2
04-01 17:03:35.125 I/BloodPressureMonitorFragment﹕ MESSAGE_STATE_CHANGE: 2

第一次 Nexus 5 的 logcat 信息(工作。不知道为什么,我以前从未见过。但只有一次):

04-01 17:14:37.577 D/BloodPressureService﹕ connect to: 8C:DE:52:2C:68:6D
04-01 17:14:37.577 D/BloodPressureService﹕ setState() 0 -> 1
04-01 17:14:37.577 I/BloodPressureMonitorFragment﹕ MESSAGE_STATE_CHANGE: 1
04-01 17:14:37.587 W/BluetoothAdapter﹕ getBluetoothService() called with no BluetoothManagerCallback
04-01 17:14:37.587 D/BluetoothSocket﹕ connect(), SocketState: INIT, mPfd: {ParcelFileDescriptor: FileDescriptor[47]}
04-01 17:14:39.207 D/BloodPressureService﹕ connected
04-01 17:14:39.207 D/BloodPressureService$ConnectedThread﹕ create ConnectedThread
04-01 17:14:39.207 D/BloodPressureService﹕ setState() 1 -> 2
04-01 17:14:39.207 I/BloodPressureService$ConnectedThread﹕ BEGIN mConnectedThread
04-01 17:14:39.217 I/BloodPressureMonitorFragment﹕ MESSAGE_STATE_CHANGE: 2

第二次 Nexus 5 的 logcat 信息(没有工作。再也不会工作):

04-01 17:14:59.977 D/BloodPressureService﹕ connect to: 8C:DE:52:2C:68:6D
04-01 17:14:59.977 D/BloodPressureService﹕ setState() 0 -> 1
04-01 17:14:59.977 I/BloodPressureMonitorFragment﹕ MESSAGE_STATE_CHANGE: 1
04-01 17:14:59.977 W/BluetoothAdapter﹕ getBluetoothService() called with no BluetoothManagerCallback
04-01 17:14:59.987 D/BluetoothSocket﹕ connect(), SocketState: INIT, mPfd: {ParcelFileDescriptor: FileDescriptor[56]}
4

1 回答 1

1

Nexus 5 的蓝牙堆栈发生了一些变化,这是有史以来最烦人的事情。当您打开套接字时,您可以尝试使用不安全的套接字,看看是否有帮助。还要确保所有现有的套接字都已关闭并且为空:-

adapter= BluetoothAdapter.getDefaultAdapter();
BluetoothDevice device = adapter.getRemoteDevice(mAddress);
BluetoothSocket socket = device.createInsecureRfcommSocketToServiceRecord(UUID);
socket.connect();

此时您应该尝试检索输出流:-

 out = socket.getOutputStream();
 in = socket.getInputStream();

还要确保完全关闭套接字:-

        if (in != null) { 
            in.close();
            in = null;
        }
        if (out != null) { 
            out.close();
            out = null;
        }
        if (socket != null) { 
            socket.close();
            socket = null;
        }
于 2014-04-01T07:19:17.983 回答