3

我正在使用 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) 上一切正常,应用崩溃后连接自动关闭。(似乎是因为有新的蓝牙堆栈)

4

2 回答 2

2

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

        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-存储一些套接字标识,允许您在应用程序重新启动时关闭它。

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

于 2013-01-21T09:25:25.710 回答
2

我通过让我的 BluetoothSockets 由在其自己的进程中运行的服务管理来解决了这个问题。我通过向服务传递消息和从服务传递消息来打开、关闭、读取和写入套接字。如果应用程序崩溃,服务会彻底关闭,关闭套接字。(如果它与应用程序在同一进程中运行,它不会完全关闭。)

于 2013-07-17T00:24:23.047 回答