应用程序崩溃后Android蓝牙连接不会关闭

我正在使用SPP配置文件连接到我的设备:

Set devices = ba.getBondedDevices(); for(BluetoothDevice bd : devices) { String name = bd.getName(); if(name.equals("CELLMETER")) { try { BluetoothSocket bs = bd.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); bs.connect(); } catch (IOException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } } 

一切似乎没关系,我创建了函数,我关闭输入输出缓冲区和关闭套接字。 但是当应用程序崩溃或我正在停止应用程序时断点到达时套接字不会关闭,即使我手动终止进程并且它不适用于新应用程序实例的新连接。

我做错了什么? 对于每次崩溃/调试操作,我必须重新启动手机:(

它仅表现在Android 2.3.5(三星5830i)和Android 4.0.4(神行者P10)上。 在我的Android 4.2.1(Galaxy Nexus)上一切正常,应用程序崩溃连接后自动关闭。 (似乎因为有新的蓝牙堆栈)

我可以看到两个选项可以解决这个问题:1-在你的应用程序中添加一个UncaughtExceptionHandler,最好是在Application派生类中:

  mUEHandler = new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { // Close any opened sockets here defaultUEH.uncaughtException(t, e); } }; Thread.setDefaultUncaughtExceptionHandler(mUEHandler); 

但这只能解决应用程序崩溃问题。 如果用户杀死应用程序,则根本不会进入该应用程序。

2-存储一些套接字标识,允许您在应用重启时关闭它。

它并不完美,但这可以解决您的问题。

我通过在自己的进程中运行的服务来管理我的BluetoothSockets来解决这个问题。 我通过将消息传入和传出服务来打开,关闭,读取和写入套接字。 如果应用程序崩溃,服务会干净地关闭,关闭套接字。 (如果它在与应用程序相同的进程中运行,它不会干净地关闭。)