【问题标题】:Android bluetooth connection doesn't close after application crash应用程序崩溃后Android蓝牙连接不关闭
【发布时间】: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 ”,应用程序内发生意外崩溃,超出蓝牙范围......当这种情况发生时,任何打开的蓝牙套接字都没有关闭,并且没有办法在应用程序退出时在代码中处理它而不调用任何东西。虽然有点;)

标签: java android bluetooth


【解决方案1】:

我可以看到 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- 存储一些套接字标识,以便您在应用重新启动时关闭它。

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

【讨论】:

  • >> 2- 存储一些套接字标识,允许您在应用程序重新启动时关闭它。
【解决方案2】:

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

【讨论】:

  • 嗯,你能告诉我如何实现或我可以在哪里阅读有关应用程序和服务之间的服务和通信的信息吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多