【问题标题】:Android: Disconnection of Bluetooth for Samsung S6 (Android Version: Lollipop)Android:三星 S6 蓝牙断开连接(Android 版本:棒棒糖)
【发布时间】:2016-03-11 12:28:03
【问题描述】:

我在三星 S6 手机(Android 版本:- Lollipop)上开发了一个 android 应用程序。 应用程序读取蓝牙端口上的数据并显示在屏幕上。

但是,蓝牙连接会在一段时间后丢失。 之后,蓝牙不断连接断开。

连接日志是:-

03-05 15:34:57.071:E/bt-btm(6152):重置 sec_bd_name 和名称标志。 (BR/EDR 链接)

03-05 15:34:57.071:E/bt-btm(6152):btm_sec_disconnected - 清除挂起标志

无效的 rfc 插槽 ID:91

03-05 16:37:42.490:W/bt-btif(6113):dm_pm_timer 过期

03-05 16:37:42.490:W/bt-btif(6113):dm_pm_timer 过期 0

03-05 16:37:42.490:W/bt-btif(6113):proc dm_pm_timer 过期

当我重新启动手机时,一切正常。但是一段时间后问题再次出现。

为什么会这样??如何在不断开连接的情况下保持连接??

编辑:- 我已经在多个版本的 android 设备上测试了我的应用程序,它可以在除三星 S6 之外的所有其他设备上正常运行。

【问题讨论】:

    标签: android bluetooth


    【解决方案1】:

    蓝牙会在一段固定的空闲时间后自动断开连接。如果您使用的是常规蓝牙外围设备,则与此无关。

    要保持与蓝牙的持续连接,您需要检查应用程序中的空闲时间,并在固定时间后通过您的OutputStream 发送垃圾数​​据。虽然这不是一个很好的方法,但可以很好地保持与蓝牙的持续连接。

    您可以采用另一种有时可能会冻结您的应用程序的方法,即在每次蓝牙断开连接时创建一个 rfcommSocket 通信。当您的BluetoothAdapter 注册监听蓝牙通信状态时,您将获得断开连接意图。在这种方法中,您需要知道蓝牙设备的 MAC 地址。下面是一个如何创建 rfcommSocket 通信的示例:

    private final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
    

    在您的BroadcastReceiver 中用于蓝牙意图过滤器:

    BluetoothDevice mDevice;
    BluetoothSocket bs;
    
    if (BluetoothDevice.ACTION_FOUND.equals(action)) {
        BluetoothDevice device = (BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
    
        if (device.getAddress().equals(YOUR_BT_MAC_ADDRESS)) {
            mDevice = device;
            bs = mDevice.createRfcommSocketToServiceRecord(MY_UUID);
            mBluetoothAdapter.cancelDiscovery();
        }
    
    }
    
    if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
        try {
            bs = mDevice.createRfcommSocketToServiceRecord(MY_UUID); 
        } catch (IOException e) {}
    }
    

    如果这与内存有关,请检查您的InputStreamOutputStream。从InputStream 读取直到它未被清除。

    【讨论】:

    • 这种断线问题只发生在三星 S6 上。我怀疑它与记忆有关。我这样说是因为断开连接仅在一段时间后才会发生,并且一旦设备重新启动就不会发生。
    • "要保持与蓝牙的连续连接,您需要检查应用程序中的空闲时间,并在固定时间后通过 OutputStream 发送垃圾数​​据。"为了保持持续通信,我们不断地通过输出流发送一些数据(保持活动状态)。问题仍然存在。
    • "...每次蓝牙断开连接时创建一个 rfcommSocket 通信。"关于这一点,蓝牙会多次断开连接,并且每次都这样做是不可行的,因为数据负载太多。
    • 是的,这种方法不太可行。但是,如果您可以正确实施,保持活动过程应该可以工作。并且,请检查 InputStream 是否溢出。
    • "并且,请检查 InputStream 是否溢出。"我检查了输入流,它没有溢出。如果输入流溢出,我在其他手机上也会遇到同样的问题。但我只在三星 S6 上遇到问题。
    猜你喜欢
    • 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
    相关资源
    最近更新 更多