【发布时间】:2013-01-11 14:52:59
【问题描述】:
我正在使用 SPP 配置文件连接到我的设备:
Set<BluetoothDevice> 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 (Samsung 5830i) 和 Android 4.0.4 (Freelander P10) 上显示。在我的 Android 4.2.1 (Galaxy Nexus) 上一切正常,应用崩溃后连接自动关闭。 (似乎是因为有新的蓝牙堆栈)
【问题讨论】:
-
你应该手动关闭套接字,你这样做吗?
-
是的!在正常情况下,当应用程序关闭时我会这样做,但是如果应用程序崩溃/被调试器关闭,我该怎么办?
-
发布抛出异常的堆栈跟踪,并在代码中指定关闭套接字的位置。
-
叶戈尔,你不懂我。现在我没有例外,它们不适用蓝牙!但是,如果我意外停止应用程序,蓝牙套接字将不会关闭!这种情况如何处理?
-
哇,这里是拼写出来的:Android 杀死应用程序以回收内存。用户在应用程序 pid 上运行“kill -9
”,应用程序内发生意外崩溃,超出蓝牙范围......当这种情况发生时,任何打开的蓝牙套接字都没有关闭,并且没有办法在应用程序退出时在代码中处理它而不调用任何东西。虽然有点;)