获取已连接的蓝牙 LE 设备列表

Posted

技术标签:

【中文标题】获取已连接的蓝牙 LE 设备列表【英文标题】:Get list of connected Bluetooth LE devices 【发布时间】:2014-12-17 03:31:53 【问题描述】:

我是蓝牙低功耗 (LE) API 的新手。有没有办法检查 android 设备当前是否连接到任何蓝牙 LE 设备并可能获取这些设备的列表?

BT-LE 设备是否真的“连接”了?我注意到当我的智能手表与我的 Nexus 5 配对/连接时,蓝牙图标在状态栏中(在 KitKat 上)没有变成白色/粗体,就像连接到经典蓝牙设备时一样。

我将以下代码用于经典设备。看起来我可以以相同的方式检查 GATT 和 GATT_SERVER,但它们总是返回断开连接。

更新:既然我已经将 Android Lollipop 刷到了我的 Nexus 5,我认为它一定是可能的,因为它用于 SmartLock,并且它以某种方式检测到我的 BT-LE Android 手表已连接。

private BluetoothAdapter getBTAdapter()        
    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR2)
        return BluetoothAdapter.getDefaultAdapter();
    else 
        BluetoothManager bm = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
        return bm.getAdapter();
    


public boolean isBluetoothConnected() 
    if(mBluetoothAdapter == null || 
            (mBluetoothAdapter.getProfileConnectionState(BluetoothProfile.HEADSET) == BluetoothProfile.STATE_DISCONNECTED 
                && mBluetoothAdapter.getProfileConnectionState(BluetoothProfile.A2DP) == BluetoothProfile.STATE_DISCONNECTED
                && mBluetoothAdapter.getProfileConnectionState(BluetoothProfile.HEALTH) == BluetoothProfile.STATE_DISCONNECTED)

            ) 

        Utils.logDebug(TAG, "GATT_SERVER " + mBluetoothAdapter.getProfileConnectionState(BluetoothProfile.GATT_SERVER));
        Utils.logDebug(TAG, "GATT " + mBluetoothAdapter.getProfileConnectionState(BluetoothProfile.GATT));
        return false;
    
    return true;

【问题讨论】:

【参考方案1】:

你可以用这个:

BluetoothManager bluetoothManager = (BluetoothManager) mContext.getSystemService(Context.BLUETOOTH_SERVICE);
List<BluetoothDevice> devices = bluetoothManager.getConnectedDevices(BluetoothProfile.GATT);
for(BluetoothDevice device : devices) 
  if(device.getType() == BluetoothDevice.DEVICE_TYPE_LE) 
     ...
  

如果您的手表确实已连接,我无法回答。可能是您的手表只宣传其状态,而手机正在收听此广告。这取决于它是如何实现的。

【讨论】:

感谢您的建议。我试过了,但不幸的是它没有返回任何设备,即使智能手表已“连接”。我认为 BT-LE 设备不会一直“连接”,而是来回通知设备...... 是的。那是可能的。永久保持连接会增加电池消耗,因此最好设计为定期进行... 现在我已经将 Android Lollipop 刷到了我的 Nexus 5,我认为它一定是可能的,因为它用于 SmartLock,并且它以某种方式检测到我的 BT-LE Android Watch 已连接。 别忘了检查 BluetoothDevice.DEVICE_TYPE_DUAL 我有一个类似的问题 - 上面的代码没有返回任何东西,无论是 LE 还是普通设备,即使状态栏中的蓝牙图标显示设备已连接。可能是耳机配置文件(扬声器)? Fitbit 也不显示。【参考方案2】:

您的 BTLE 设备可以在系统中使用不同的配置文件进行注册。 Android 的 API 只公开了一些配置文件(GATT、GATT_SERVER、Headset 等)。但是,还有其他配置文件可以注册为系统,例如 INPUT_DECVICE。调用 getConnectedDevices() 仅适用于 GATT 和 GATT_SERVER 配置文件,但如果您的设备注册为任何其他配置文件,则该方法将不起作用。

【讨论】:

以上是关于获取已连接的蓝牙 LE 设备列表的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式判断蓝牙设备是不是已连接?

android的蓝牙匹配连接

如何获取已连接蓝牙设备的 rssi 值

android 获取蓝牙已连接设备

如何从蓝牙 LE 设备获取数据

目前连接的蓝牙设备android