IOException:读取失败,套接字可能关闭 - Android 4.3 上的蓝牙
Posted
技术标签:
【中文标题】IOException:读取失败,套接字可能关闭 - Android 4.3 上的蓝牙【英文标题】:IOException: read failed, socket might closed - Bluetooth on Android 4.3 【发布时间】:2013-09-10 12:48:06 【问题描述】:目前,我正在尝试在我的 Nexus 7(2012)上打开蓝牙套接字时处理一个奇怪的异常,使用 android 4.3(构建 JWR66Y,我猜是第二个 4.3 更新)。我看过一些相关的帖子(例如https://***.com/questions/13648373/bluetoothsocket-connect-throwing-exception-read-failed),但似乎没有一个可以解决这个问题。此外,正如这些线程中所建议的,重新配对并没有帮助,并且不断尝试连接(通过愚蠢的循环)也没有任何效果。
我正在处理一个嵌入式设备(一个不知名的 OBD-II 车载适配器,类似于 http://images04.olx.com/ui/15/53/76/1316534072_254254776_2-OBD-II-BLUTOOTH-ADAPTERSCLEAR-CHECK-ENGINE-LIGHTS-WITH-YOUR-PHONE-Oceanside.jpg)。我的 Android 2.3.7 手机连接没有任何问题,同事的 Xperia(Android 4.1.2)也可以。另一个 Google Nexus(我不知道是“One”还是“S”,但不是“4”)在 Android 4.3 上也失败了。
这是连接建立的片段。它在自己的线程中运行,在服务中创建。
private class ConnectThread extends Thread
private static final UUID EMBEDDED_BOARD_SPP = UUID
.fromString("00001101-0000-1000-8000-00805F9B34FB");
private BluetoothAdapter adapter;
private boolean secure;
private BluetoothDevice device;
private List<UUID> uuidCandidates;
private int candidate;
protected boolean started;
public ConnectThread(BluetoothDevice device, boolean secure)
logger.info("initiliasing connection to device "+device.getName() +" / "+ device.getAddress());
adapter = BluetoothAdapter.getDefaultAdapter();
this.secure = secure;
this.device = device;
setName("BluetoothConnectThread");
if (!startQueryingForUUIDs())
this.uuidCandidates = Collections.singletonList(EMBEDDED_BOARD_SPP);
this.start();
else
logger.info("Using UUID discovery mechanism.");
/*
* it will start upon the broadcast receive otherwise
*/
private boolean startQueryingForUUIDs()
Class<?> cl = BluetoothDevice.class;
Class<?>[] par = ;
Method fetchUuidsWithSdpMethod;
try
fetchUuidsWithSdpMethod = cl.getMethod("fetchUuidsWithSdp", par);
catch (NoSuchMethodException e)
logger.warn(e.getMessage());
return false;
Object[] args = ;
try
BroadcastReceiver receiver = new BroadcastReceiver()
@Override
public void onReceive(Context context, Intent intent)
BluetoothDevice deviceExtra = intent.getParcelableExtra("android.bluetooth.device.extra.DEVICE");
Parcelable[] uuidExtra = intent.getParcelableArrayExtra("android.bluetooth.device.extra.UUID");
uuidCandidates = new ArrayList<UUID>();
for (Parcelable uuid : uuidExtra)
uuidCandidates.add(UUID.fromString(uuid.toString()));
synchronized (ConnectThread.this)
if (!ConnectThread.this.started)
ConnectThread.this.start();
ConnectThread.this.started = true;
unregisterReceiver(this);
;
registerReceiver(receiver, new IntentFilter("android.bleutooth.device.action.UUID"));
registerReceiver(receiver, new IntentFilter("android.bluetooth.device.action.UUID"));
fetchUuidsWithSdpMethod.invoke(device, args);
catch (IllegalArgumentException e)
logger.warn(e.getMessage());
return false;
catch (IllegalAccessException e)
logger.warn(e.getMessage());
return false;
catch (InvocationTargetException e)
logger.warn(e.getMessage());
return false;
return true;
public void run()
boolean success = false;
while (selectSocket())
if (bluetoothSocket == null)
logger.warn("Socket is null! Cancelling!");
deviceDisconnected();
openTroubleshootingActivity(TroubleshootingActivity.BLUETOOTH_EXCEPTION);
// Always cancel discovery because it will slow down a connection
adapter.cancelDiscovery();
// Make a connection to the BluetoothSocket
try
// This is a blocking call and will only return on a
// successful connection or an exception
bluetoothSocket.connect();
success = true;
break;
catch (IOException e)
// Close the socket
try
shutdownSocket();
catch (IOException e2)
logger.warn(e2.getMessage(), e2);
if (success)
deviceConnected();
else
deviceDisconnected();
openTroubleshootingActivity(TroubleshootingActivity.BLUETOOTH_EXCEPTION);
private boolean selectSocket()
if (candidate >= uuidCandidates.size())
return false;
BluetoothSocket tmp;
UUID uuid = uuidCandidates.get(candidate++);
logger.info("Attempting to connect to SDP "+ uuid);
try
if (secure)
tmp = device.createRfcommSocketToServiceRecord(
uuid);
else
tmp = device.createInsecureRfcommSocketToServiceRecord(
uuid);
bluetoothSocket = tmp;
return true;
catch (IOException e)
logger.warn(e.getMessage() ,e);
return false;
代码在bluetoothSocket.connect()
失败。我收到了java.io.IOException: read failed, socket might closed, read ret: -1
。这是GitHub上的对应来源:https://github.com/android/platform_frameworks_base/blob/android-4.3_r2/core/java/android/bluetooth/BluetoothSocket.java#L504
它通过readInt()调用,从https://github.com/android/platform_frameworks_base/blob/android-4.3_r2/core/java/android/bluetooth/BluetoothSocket.java#L319调用
使用的套接字的一些元数据转储导致以下信息。这些在 Nexus 7 和我的 2.3.7 手机上完全相同。
Bluetooth Device 'OBDII'
Address: 11:22:33:DD:EE:FF
Bond state: 12 (bonded)
Type: 1
Class major version: 7936
Class minor version: 7936
Class Contents: 0
Contents: 0
我还有一些其他的 OBD-II 适配器(更广泛的),它们都可以工作。有没有可能我遗漏了什么或者这可能是 Android 中的错误?
【问题讨论】:
我已经尝试了上面的解决方案,可以帮忙解决这个问题***.com/q/52105647/1559331 【参考方案1】:我终于找到了解决方法。魔法隐藏在BluetoothDevice
类的底层(参见https://github.com/android/platform_frameworks_base/blob/android-4.3_r2/core/java/android/bluetooth/BluetoothDevice.java#L1037)。
现在,当我收到该异常时,我会实例化一个回退BluetoothSocket
,类似于下面的源代码。如您所见,通过反射调用隐藏方法createRfcommSocket
。我不知道为什么隐藏此方法。虽然源代码将其定义为public
...
Class<?> clazz = tmp.getRemoteDevice().getClass();
Class<?>[] paramTypes = new Class<?>[] Integer.TYPE;
Method m = clazz.getMethod("createRfcommSocket", paramTypes);
Object[] params = new Object[] Integer.valueOf(1);
fallbackSocket = (BluetoothSocket) m.invoke(tmp.getRemoteDevice(), params);
fallbackSocket.connect();
connect()
然后不再失败。我仍然遇到了一些问题。基本上,这有时会阻塞并失败。在这种情况下,重新启动 SPP 设备(关闭/插入)会有所帮助。有时即使设备已经绑定,我也会在connect()
之后收到另一个配对请求。
更新:
这是一个完整的类,包含一些嵌套类。对于真正的实现,这些可以作为单独的类进行。
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.util.List;
import java.util.UUID;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.util.Log;
public class BluetoothConnector
private BluetoothSocketWrapper bluetoothSocket;
private BluetoothDevice device;
private boolean secure;
private BluetoothAdapter adapter;
private List<UUID> uuidCandidates;
private int candidate;
/**
* @param device the device
* @param secure if connection should be done via a secure socket
* @param adapter the Android BT adapter
* @param uuidCandidates a list of UUIDs. if null or empty, the Serial PP id is used
*/
public BluetoothConnector(BluetoothDevice device, boolean secure, BluetoothAdapter adapter,
List<UUID> uuidCandidates)
this.device = device;
this.secure = secure;
this.adapter = adapter;
this.uuidCandidates = uuidCandidates;
if (this.uuidCandidates == null || this.uuidCandidates.isEmpty())
this.uuidCandidates = new ArrayList<UUID>();
this.uuidCandidates.add(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
public BluetoothSocketWrapper connect() throws IOException
boolean success = false;
while (selectSocket())
adapter.cancelDiscovery();
try
bluetoothSocket.connect();
success = true;
break;
catch (IOException e)
//try the fallback
try
bluetoothSocket = new FallbackBluetoothSocket(bluetoothSocket.getUnderlyingSocket());
Thread.sleep(500);
bluetoothSocket.connect();
success = true;
break;
catch (FallbackException e1)
Log.w("BT", "Could not initialize FallbackBluetoothSocket classes.", e);
catch (InterruptedException e1)
Log.w("BT", e1.getMessage(), e1);
catch (IOException e1)
Log.w("BT", "Fallback failed. Cancelling.", e1);
if (!success)
throw new IOException("Could not connect to device: "+ device.getAddress());
return bluetoothSocket;
private boolean selectSocket() throws IOException
if (candidate >= uuidCandidates.size())
return false;
BluetoothSocket tmp;
UUID uuid = uuidCandidates.get(candidate++);
Log.i("BT", "Attempting to connect to Protocol: "+ uuid);
if (secure)
tmp = device.createRfcommSocketToServiceRecord(uuid);
else
tmp = device.createInsecureRfcommSocketToServiceRecord(uuid);
bluetoothSocket = new NativeBluetoothSocket(tmp);
return true;
public static interface BluetoothSocketWrapper
InputStream getInputStream() throws IOException;
OutputStream getOutputStream() throws IOException;
String getRemoteDeviceName();
void connect() throws IOException;
String getRemoteDeviceAddress();
void close() throws IOException;
BluetoothSocket getUnderlyingSocket();
public static class NativeBluetoothSocket implements BluetoothSocketWrapper
private BluetoothSocket socket;
public NativeBluetoothSocket(BluetoothSocket tmp)
this.socket = tmp;
@Override
public InputStream getInputStream() throws IOException
return socket.getInputStream();
@Override
public OutputStream getOutputStream() throws IOException
return socket.getOutputStream();
@Override
public String getRemoteDeviceName()
return socket.getRemoteDevice().getName();
@Override
public void connect() throws IOException
socket.connect();
@Override
public String getRemoteDeviceAddress()
return socket.getRemoteDevice().getAddress();
@Override
public void close() throws IOException
socket.close();
@Override
public BluetoothSocket getUnderlyingSocket()
return socket;
public class FallbackBluetoothSocket extends NativeBluetoothSocket
private BluetoothSocket fallbackSocket;
public FallbackBluetoothSocket(BluetoothSocket tmp) throws FallbackException
super(tmp);
try
Class<?> clazz = tmp.getRemoteDevice().getClass();
Class<?>[] paramTypes = new Class<?>[] Integer.TYPE;
Method m = clazz.getMethod("createRfcommSocket", paramTypes);
Object[] params = new Object[] Integer.valueOf(1);
fallbackSocket = (BluetoothSocket) m.invoke(tmp.getRemoteDevice(), params);
catch (Exception e)
throw new FallbackException(e);
@Override
public InputStream getInputStream() throws IOException
return fallbackSocket.getInputStream();
@Override
public OutputStream getOutputStream() throws IOException
return fallbackSocket.getOutputStream();
@Override
public void connect() throws IOException
fallbackSocket.connect();
@Override
public void close() throws IOException
fallbackSocket.close();
public static class FallbackException extends Exception
/**
*
*/
private static final long serialVersionUID = 1L;
public FallbackException(Exception e)
super(e);
【讨论】:
@MD 我不知道怎么做。我刚刚测试并发现它正在工作。 它在 nexus 4 上不起作用。你能告诉我如何克服这个问题。我几乎尝试了一切。谢谢。 @matthes 很抱歉,但即使您使用后备的解决方案也没有解决我的问题。低于错误。Fallback failed. Cancelling. java.io.IOException: Connection refused
请帮忙。
@matthes "SPP-Device (plug off / plug in) 在这种情况下会有所帮助。" .开/关声明是世界上最被低估的。我只是浪费了 3 个小时,我所要做的就是打开和关闭它 -_-
当我尝试在 BluetoothSocketWrapper getOutputStream() 中写入时,我得到 java.io.IOException: socket closed 异常。【参考方案2】:
好吧,我的代码也有同样的问题,这是因为自从 android 4.2 蓝牙堆栈发生了变化。所以我的代码在 android "read failed, socket might closed or timeout, read ret: -1"
问题出在socket.mPort
参数上。当您使用 socket = device.createRfcommSocketToServiceRecord(SERIAL_UUID);
创建套接字时,mPort
获取整数值“-1”,并且该值似乎不适用于 android >=4.2,因此您需要将其设置为“1”。坏消息是 createRfcommSocketToServiceRecord
只接受 UUID 作为参数而不接受 mPort
所以我们必须使用其他方法。 @matthes 发布的答案也对我有用,但我简化了它:socket =(BluetoothSocket) device.getClass().getMethod("createRfcommSocket", new Class[] int.class).invoke(device,1);
。我们需要使用两个套接字属性,第二个作为后备。
所以代码是(用于连接到 ELM327 设备上的 SPP):
BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
if (btAdapter.isEnabled())
SharedPreferences prefs_btdev = getSharedPreferences("btdev", 0);
String btdevaddr=prefs_btdev.getString("btdevaddr","?");
if (btdevaddr != "?")
BluetoothDevice device = btAdapter.getRemoteDevice(btdevaddr);
UUID SERIAL_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); // bluetooth serial port service
//UUID SERIAL_UUID = device.getUuids()[0].getUuid(); //if you don't know the UUID of the bluetooth device service, you can get it like this from android cache
BluetoothSocket socket = null;
try
socket = device.createRfcommSocketToServiceRecord(SERIAL_UUID);
catch (Exception e) Log.e("","Error creating socket");
try
socket.connect();
Log.e("","Connected");
catch (IOException e)
Log.e("",e.getMessage());
try
Log.e("","trying fallback...");
socket =(BluetoothSocket) device.getClass().getMethod("createRfcommSocket", new Class[] int.class).invoke(device,1);
socket.connect();
Log.e("","Connected");
catch (Exception e2)
Log.e("", "Couldn't establish Bluetooth connection!");
else
Log.e("","BT device not selected");
【讨论】:
版主:既然你无缘无故删除了我之前的答案,我再发一次。 感谢 George 对mPort
参数的见解!恕我直言,工作流程保持不变,我只是用一些实现接口的类包装了一些东西。
是的,我已经说过你的解决方案很好,但我想让人们理解为什么它需要从 android 4.2 开始使用这种方法
SPP = 串行端口配置文件(模拟蓝牙上的串行端口),ELM327 是蓝牙 obd 汽车设备,谷歌它。
在将端口值从 1 更改为 2 后,它对我有用。请查看此代码。 socket =(BluetoothSocket) device.getClass().getMethod("createRfcommSocket", new Class[] int.class).invoke(device,2); socket.connect();【参考方案3】:
首先,如果您需要与蓝牙 2.x 设备通话,this documentation 声明:
提示:如果您要连接到蓝牙串行板,请尝试使用 众所周知的 SPP UUID 00001101-0000-1000-8000-00805F9B34FB。然而 如果您要连接到 Android 对等体,请生成您自己的 唯一的 UUID。
我不认为它会起作用,但只有将 UUID 替换为 00001101-0000-1000-8000-00805F9B34FB
才能起作用。不过这段代码好像是处理SDK版本的问题,你可以在定义如下方法后将函数device.createRfcommSocketToServiceRecord(mMyUuid);
替换为tmp = createBluetoothSocket(mmDevice);
:
private BluetoothSocket createBluetoothSocket(BluetoothDevice device)
throws IOException
if(Build.VERSION.SDK_INT >= 10)
try
final Method m = device.getClass().getMethod("createInsecureRfcommSocketToServiceRecord", new Class[] UUID.class );
return (BluetoothSocket) m.invoke(device, mMyUuid);
catch (Exception e)
Log.e(TAG, "Could not create Insecure RFComm Connection",e);
return device.createRfcommSocketToServiceRecord(mMyUuid);
源代码不是我的,来自this website。
【讨论】:
解决了将近 2 天的工作... 谢天谢地 ...没有这个 UUID 套接字将立即关闭并失败,无需进一步解释。 非常感谢您的帮助我的 UUID 是字母数字,我正在尝试连接 HC-5,但我的蓝牙显示连接失败,但是当我使用此解决方案时,我的问题解决了。再次感谢您【参考方案4】:我的症状与此处描述的相同。我可以连接一次蓝牙打印机,但无论我做什么,随后的连接都失败了,“套接字已关闭”。
我觉得这里描述的变通方法是必要的有点奇怪。浏览完我的代码后,我发现我忘记关闭套接字的 InputStream 和 OutputStram 并且没有正确终止 ConnectedThreads。
我使用的 ConnectedThread 与此处的示例相同:
http://developer.android.com/guide/topics/connectivity/bluetooth.html
请注意,ConnectThread 和 ConnectedThread 是两个不同的类。
启动 ConnectedThread 的任何类都必须在线程上调用 interrupt() 和 cancel()。 我在 ConnectedTread.cancel() 方法中添加了 mmInStream.close() 和 mmOutStream.close()。
正确关闭线程/流/套接字后,我可以毫无问题地创建新的套接字。
【讨论】:
谢谢,遇到了同样的问题,刚才我发现我还没有关闭流和连接... 尝试了上述所有场景,(除了删除其他配对设备导致很好这确实不是解决方案,发现是的......这通常只发生在输入流和套接字没有时正确关闭.....!!【参考方案5】:嗯,我确实发现了问题。
大多数尝试使用socket.Connect();
建立连接的人都会得到一个名为Java.IO.IOException: read failed, socket might closed, read ret: -1
的异常。
在某些情况下,它还取决于您的蓝牙设备,因为有两种不同类型的蓝牙,即 BLE(低功耗)和经典。
如果你想检查你的蓝牙设备的类型,代码如下:
String checkType;
var listDevices = BluetoothAdapter.BondedDevices;
if (listDevices.Count > 0)
foreach (var btDevice in listDevices)
if(btDevice.Name == "MOCUTE-032_B52-CA7E")
checkType = btDevice.Type.ToString();
Console.WriteLine(checkType);
我已经尝试了几天来解决这个问题,但是从今天开始我发现了这个问题。不幸的是,@matthes 的解决方案仍然存在一些问题,正如他已经说过的,但这是我的解决方案。
目前我在 Xamarin Android 中工作,但这也应该适用于其他平台。
解决方案
如果有多个配对设备,则应移除其他配对设备。所以只保留你想连接的那个(见右图)。
在左图中,您可以看到我有两个配对设备,即“MOCUTE-032_B52-CA7E”和“Blue Easy”。这就是问题所在,但我不知道为什么会出现这个问题。可能蓝牙协议正试图从另一个蓝牙设备获取一些信息。
但是,socket.Connect();
现在运行良好,没有任何问题。所以我只想分享这个,因为这个错误真的很烦人。
祝你好运!
【讨论】:
这在我遇到此问题的一个设备上有效,仅在我的 5.0 手机上发生,即使这样也只有在我第一次启用 BT,然后打开连接时才会发生。如果 BT 已经开启,则没有连接问题!它不会发生在具有更高版本 Android 的设备上,这表明开发人员注意到了该错误并修复了它,但 Android BT 页面对此一言不发。但是您的解决方案有效,谢谢!【参考方案6】:在较新版本的 Android 上,我收到此错误,因为当我尝试连接到套接字时适配器仍在发现。即使我在蓝牙适配器上调用了 cancelDiscovery 方法,我也必须等到使用操作 BluetoothAdapter.ACTION_DISCOVERY_FINISHED 调用广播接收器的 onReceive() 方法的回调。
一旦我等待适配器停止发现,那么套接字上的连接调用就成功了。
【讨论】:
【参考方案7】:你把
registerReceiver(receiver, new IntentFilter("android.bleutooth.device.action.UUID"));
“蓝牙”拼写为“蓝牙”。
【讨论】:
【参考方案8】:如果有人对 Kotlin 有疑问,我必须遵循已接受的答案,但会有一些变化:
fun print(view: View, text: String)
var adapter = BluetoothAdapter.getDefaultAdapter();
var pairedDevices = adapter.getBondedDevices()
var uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")
if (pairedDevices.size > 0)
for (device in pairedDevices)
var s = device.name
if (device.getName().equals(printerName, ignoreCase = true))
Thread
var socket = device.createInsecureRfcommSocketToServiceRecord(uuid)
var clazz = socket.remoteDevice.javaClass
var paramTypes = arrayOf<Class<*>>(Integer.TYPE)
var m = clazz.getMethod("createRfcommSocket", *paramTypes)
var fallbackSocket = m.invoke(socket.remoteDevice, Integer.valueOf(1)) as BluetoothSocket
try
fallbackSocket.connect()
var stream = fallbackSocket.outputStream
stream.write(text.toByteArray(Charset.forName("UTF-8")))
catch (e: Exception)
e.printStackTrace()
Snackbar.make(view, "An error occurred", Snackbar.LENGTH_SHORT).show()
.start()
希望对你有帮助
【讨论】:
【参考方案9】:蓝牙设备可以同时在经典模式和 LE 模式下运行。有时他们使用不同的 MAC 地址,具体取决于您的连接方式。呼叫socket.connect()
使用的是经典蓝牙,因此您必须确保扫描时获得的设备确实是经典设备。
不过,很容易过滤掉经典设备:
if(BluetoothDevice.DEVICE_TYPE_LE == device.getType())
//socket.connect()
如果不进行此项检查,则混合扫描会首先为您提供 Classic 设备还是 BLE 设备,这是一个竞争条件。它可能表现为间歇性无法连接,或者某些设备能够可靠连接,而其他设备似乎永远无法连接。
【讨论】:
【参考方案10】:我也遇到过这个问题,你可以通过两种方式解决,如前所述使用反射来创建套接字 第二个是, 客户端正在寻找具有给定 UUID 的服务器,如果您的服务器未与客户端并行运行,则会发生这种情况。 使用给定的客户端 UUID 创建一个服务器,然后从服务器端侦听并接受客户端。它将工作。
【讨论】:
【参考方案11】:即使我遇到了同样的问题,终于明白了我的问题,我试图从(超出范围)蓝牙覆盖范围进行连接。
【讨论】:
【参考方案12】:我遇到了这个问题,并通过在关闭套接字之前关闭输入和输出流来解决它。现在我可以毫无问题地断开连接并重新连接。
https://***.com/a/3039807/5688612
在 Kotlin 中:
fun disconnect()
bluetoothSocket.inputStream.close()
bluetoothSocket.outputStream.close()
bluetoothSocket.close()
【讨论】:
【参考方案13】:如果您的代码的另一部分已经与相同的套接字和 UUID 建立了连接,则会出现此错误。
【讨论】:
但是如果我从这个套接字断开并尝试再次连接? 当然可以,但就我而言,它需要改变架构,因为我没有“拥有”另一个模块!【参考方案14】:我遇到过这个问题,解决方法是使用特殊的魔法 GUID。
val id: UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB") // Any other GUID doesn't work.
val device: BluetoothDevice = bta!!.bondedDevices.first z -> z.name == deviceName
bts = device.createRfcommSocketToServiceRecord(id) // mPort is -1
bts?.connect()
// Start processing thread.
我怀疑这些是有效的 UUID:
var did: Array<ParcelUuid?> = device.uuids
但是,我还没有全部尝试过。
【讨论】:
即使我使用相同的 UUID。但没有帮助我。这是否仅支持连接到经典蓝牙设备(不支持 BLE)?我必须做什么才能使用 Xamarin.Forms 连接到 BLE 设备。在这里发布 [***.com/questions/62371859/… 我使用的是经典蓝牙; BLE是垃圾。【参考方案15】:通过添加过滤操作解决了我的问题
// Register for broadcasts when a device is discovered
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(mReceiver, intentFilter);
【讨论】:
【参考方案16】:我也收到了相同的IOException
,但我发现 Android 系统演示:“BluetoothChat”项目正在运行。我确定问题出在 UUID。
所以我将我的UUID.fromString("00001001-0000-1000-8000-00805F9B34FB")
替换为UUID.fromString("8ce255c0-200a-11e0-ac64-0800200c9a66")
并且它在大多数情况下都可以正常工作,只是有时需要重新启动蓝牙设备;
【讨论】:
以上是关于IOException:读取失败,套接字可能关闭 - Android 4.3 上的蓝牙的主要内容,如果未能解决你的问题,请参考以下文章
react-native蓝牙连接失败:java.io.IOException读取失败,套接字可能关闭或超时,读取ret:-1
java.io.IOException: 读取失败,套接字可能关闭或超时,在 Android 5.0.1 Lollipop 版本上读取 ret: -1
Zebra 打印机连接失败“读取失败,套接字可能关闭或超时,读取 ret:-1”
蓝牙连接错误:“jnius.jnius.JavaException:发生 JVM 异常:读取失败,套接字可能关闭或超时,读取 ret:-1”