创建套接字的第一种方法:
try {
socket = device.createRfcommSocketToServiceRecord(BSERVICE_UUID)
} catch(e: Exception) {
e.printStackTrace()
}
创建套接字的第二种方法:
try {
socket = device.createInsecureRfcommSocketToServiceRecord(BSERVICE_UUID)
} catch(e: Exception) {
e.printStackTrace()
}
创建套接字的第三种方法:
try {
socket = createRfcommSocket(device)
} catch(e: Exception) {
e.printStackTrace()
}
将createRfcommSocket(device)定义为:
private fun createRfcommSocket(device: BluetoothDevice): BluetoothSocket? {
val method = device::class.java.getMethod("createRfcommSocket", Int::class.javaPrimitiveType)
return method.invoke(device, 1) as BluetoothSocket?
}
在我实际上在非空引用上调用BluetoothSocket #connect()之前执行任何这些操作。线程被冻结了一段时间然后 - 抛出异常:
java.io.IOException: read failed, socket might closed or timeout, read ret: -1
W/System.err: at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:581)
W/System.err: at android.bluetooth.BluetoothSocket.waitSocketSignal(BluetoothSocket.java:558)
W/System.err: at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:374)
与此问题相关的所有数据:
此处的主题设备是通过BluetoothAdapter#startDiscovery()方法找到的,并注册了适当的广播接收器。过程如下:在本地缓存设备,然后,在收到ACTION_DISCOVERY_FINISHED意图后 - 开始调用BluetoothDevice#fetchUuidsWithSdp()。上述问题的潜在原因是在ACTION_UUID Intent中我收到一个null作为UUID Array对象,该对象是从intent中使用键BluetoothDevice.EXTRA_UUID提取的。
在API级别为19的三星Galaxy Tab S上测试。没有root。使用BLE,它可以在同一设备上正常工作。
UUID都不起作用:既不是标准也不是#00; 00001101-0000-1000-8000-00805F9B34FB"也可能是设备文档中的任何可能的。
有趣的是,基于反射的解决方案给出了同样的问题。
UPD:从日志中发现了另一件事。调用connect函数后几秒钟我得到了这个:
D/BluetoothSocket: SecProductFeature_BLUETOOTH.SEC_PRODUCT_FEATURE_BLUETOOTH_IT_POLICY_FEATURE = true
W/BluetoothAdapter: getBluetoothService() called with no BluetoothManagerCallback
第一行在google中没有结果,不知怎的,这可能是我问题的原因?
答案 0 :(得分:0)
已关闭,设备不支持蓝牙经典,并且只允许在BLE顶部构建交互。