禁用蓝牙适配器后如何让Android连接&;重新启用?

禁用蓝牙适配器后如何让Android连接&;重新启用?,android,bluetooth,bluetooth-lowenergy,android-bluetooth,android-ble,Android,Bluetooth,Bluetooth Lowenergy,Android Bluetooth,Android Ble,我已经编写了一个应用程序,连接到一个可扩展设备。该应用程序在大多数设备上运行正常;但一些设备(最明显的是华为P8Lite和Nexus6p)在蓝牙适配器被禁用后拒绝连接 这是测试顺序: 确保应用程序未运行 从顶部向下滑动,禁用BT几秒钟,然后重新启用蓝牙 启动应用程序。应用程序会自动连接到存储在首选项中的蓝牙地址 等待连接。这是华为手机上没有发生任何事情的地方,但其他手机,如三星,工作起来很有魅力 从另一部手机验证设备是否正在广告中,您可以 连接到它 这是我用来连接的代码: private fin

我已经编写了一个应用程序,连接到一个可扩展设备。该应用程序在大多数设备上运行正常;但一些设备(最明显的是华为P8Lite和Nexus6p)在蓝牙适配器被禁用后拒绝连接

这是测试顺序:

  • 确保应用程序未运行
  • 从顶部向下滑动,禁用BT几秒钟,然后重新启用蓝牙
  • 启动应用程序。应用程序会自动连接到存储在首选项中的蓝牙地址
  • 等待连接。这是华为手机上没有发生任何事情的地方,但其他手机,如三星,工作起来很有魅力
  • 从另一部手机验证设备是否正在广告中,您可以 连接到它
  • 这是我用来连接的代码:

    private final Runnable mBeginConnectRunnable = new Runnable() {
        @Override
        public void run() {
            synchronized (GattConnection.this) {
                if (mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()) {
                    try {
                        mBluetoothAdapter.cancelDiscovery();
                        mBluetoothDevice = mBluetoothAdapter.getRemoteDevice(mAddress);
                        mGatt = mBluetoothDevice.connectGatt(mContext, mBackgroundConnect, mGattCallback);
                        final boolean connectSuccess = mGatt.connect();
                        Log.d(TAG, String.format(Locale.ENGLISH, "mGatt.connect(%s, %s) %s",
                                mAddress,
                                mBackgroundConnect ? "background[slow]" : "foreground[fast]",
                                connectSuccess ? "success" : "failed"));
                        refreshDeviceCache(mGatt);
    
                    } catch (Exception ex) {
                        Log.e(TAG, "Create connection failed: " + ex.getMessage());
                        setState(State.Closed);
                    }
                } else {
                    Log.d(TAG, "Can't create connection. Adapter is disabled");
                    setState(State.Closed);
                }
            }
        }
    };
    
    所有调用都通过处理程序发布到主线程。我可以看到它在等待连接,30秒后放弃,我调用对象上的BluetoothGatt.close()并将其置空。好像什么都没有

    过了一段时间,当天晚些时候,它又开始工作了

    非常感谢您的帮助:-)

    更新日期:2018年9月14日:在Emil的精彩解释之后,我已经更新了我们的应用程序,因此Nexus上没有这个问题。我注意到华为P8 Lite继续在后台扫描,似乎你无法阻止它

    为了演示这些问题,我制作了一个非常简单、干净的应用程序,在手机上运行蓝牙LE功能,并用它来演示这个问题,同时还演示了P8坏了。该应用程序可在以下位置获得: 资料来源如下:


    我希望随着时间的推移,我可以扩展这个应用程序,使其成为Android的测试工具,记录所有来自Android的stange行为,并将其收集到数据库中。如果你有兴趣投稿,请毫不犹豫地在bt上给我发封邮件。error@millibit.dk

    Android蓝牙协议栈的API存在设计缺陷。当您通过蓝牙设备地址连接到特定设备时,无法判断您指的是公共地址还是随机地址

    如果您开始使用autoConnect=false连接到未绑定且最近未在扫描中看到的设备,它将假定您指的是公共地址。因此,如果您尝试连接到具有静态随机地址的设备,它将失败


    如果设备未绑定,为确保使用正确的地址类型进行连接,必须先执行扫描,找到设备,然后开始连接尝试。

    I禁用BT几秒钟,然后再次启用它。然后我启动应用程序,它会自动连接到上次连接的地址。我从日志中确认了这一点:11:23:19.191 D/gatt连接:mGatt.connect(DE:97:0D:7F:2E:32,前台[fast])成功11:23:49.193 D/gatt连接:onBluetooth断开连接您的外设有公共蓝牙设备地址还是随机地址?此外,您的设备是否已绑定?但我真的不明白你的问题;当然,如果蓝牙已关闭,您将无法连接?蓝牙未关闭。我更新了描述以便更好地解释。地址是随机的,不会改变。“随机”地址存储在设备的出厂设置中。此外,设备未进行粘合。我已完全控制设备,并已确认未尝试连接。我也和伊藤肯一起检查过。问题是一样的。蓝牙被禁用后,您无法建立连接。是的,华为P8 Lite的BLE在很多方面都已损坏。它通常只是随机失效。