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

时间:2013-01-11 14:52:59

标签: java android bluetooth

我正在使用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(三星5830i)和Android 4.0.4(神行者P10)。在我的Android 4.2.1(Galaxy Nexus)上一切正常,应用程序崩溃连接后自动关闭。 (似乎因为有新的蓝牙堆栈)

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

我可以看到两个选项来解决这个问题: 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-存储一些套接字标识,允许您在应用重启时关闭它。

这不完美,但这可以解决你的问题。