Java Android蓝牙连接没有';应用程序崩溃后无法关闭

Java Android蓝牙连接没有';应用程序崩溃后无法关闭,java,android,bluetooth,Java,Android,Bluetooth,我正在使用SPP配置文件连接到我的设备: Set<BluetoothDevice> devices = ba.getBondedDevices(); for(BluetoothDevice bd : devices) { String name = bd.getName(); if(name.equals("CELLMETER")) { try {

我正在使用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.
            }
        }
    }
Set devices=ba.getBondedDevices();
用于(蓝牙设备bd:devices)
{
字符串名称=bd.getName();
如果(名称等于(“CELLMETER”))
{
尝试
{
BluetoothSocket bs=bd.createRfcommSocketToServiceRecord(UUID.fromString(“00001101-0000-1000-8000-00805F9B34FB”);
连接();
}捕获(IOE异常)
{
e、 printStackTrace();//要更改catch语句的主体,请使用文件|设置|文件模板。
}
}
}
看起来一切正常,我创建了一个函数,在这里我关闭输入输出缓冲区并关闭套接字。 但当应用程序崩溃或者当断点到达时我正在停止应用程序时,套接字并没有关闭,即使在我手动终止进程之后,从应用程序的新实例进行新连接也是不可用的

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


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

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


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

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

你应该手动关闭套接字,你在这样做吗?是的!我在应用程序关闭的正常情况下这样做,但是如果应用程序崩溃/被调试器关闭,我该怎么办?发布抛出的异常堆栈跟踪,并在代码中指定关闭套接字的位置。Egor,你不明白我的意思。现在我没有异常,它们都是错误的我们没有应用蓝牙!但如果我意外停止应用程序,蓝牙套接字将不会关闭!如何处理这种情况?哇,这里的说明是:Android杀死应用程序以回收内存。用户运行“kill-9”在应用程序pid上,应用程序内部发生意外崩溃,超出了蓝牙的作用域…当这种情况发生时,任何打开的蓝牙套接字都不会关闭,并且无法在代码中处理该问题,因为应用程序退出时没有任何调用。尽管如此;)>>2-存储一些套接字标识,允许您在应用程序重新启动时关闭它。嗯,您能告诉我如何实现或在哪里可以阅读有关服务以及应用程序和服务之间通信的信息吗?