如何检查Android蓝牙设备当前使用的是Central还是Peripheral模式?
获取Android设备当前BLE工作模式的方案
Android系统没有提供直接API返回设备当前正在使用的BLE Central/Peripheral模式,需要通过监听蓝牙组件的状态回调来判断设备的活跃模式,以下是具体实现方案:
判断Central模式(作为中心设备)
当设备作为BLE中心时,通常会执行扫描外设或与外设建立连接的操作,可通过以下两种方式判断:
- 监听BLE扫描状态:通过
BluetoothLeScanner的ScanCallback捕获扫描启动事件,确认设备处于Central模式活跃状态。 - 监听GATT连接状态:通过
BluetoothGattCallback捕获与外设的连接状态,当存在活跃的GATT连接时,说明设备正在以Central模式工作。
代码示例:
// 监听BLE扫描状态 BluetoothLeScanner scanner = BluetoothAdapter.getDefaultAdapter().getBluetoothLeScanner(); ScanCallback scanCallback = new ScanCallback() { @Override public void onScanResult(int callbackType, ScanResult result) { super.onScanResult(callbackType, result); // 扫描正在进行,设备当前处于Central模式活跃状态 } }; // 启动扫描时触发上述回调 scanner.startScan(scanCallback); // 监听GATT连接状态 BluetoothGattCallback gattCallback = new BluetoothGattCallback() { @Override public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { super.onConnectionStateChange(gatt, status, newState); if (newState == BluetoothProfile.STATE_CONNECTED) { // 已与BLE外设建立连接,设备当前处于Central模式 } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { // 连接断开,需检查是否存在其他活跃的GATT连接 } } }; // 连接外设时触发上述回调 BluetoothDevice device = ...; // 获取目标外设设备实例 device.connectGatt(context, false, gattCallback);
判断Peripheral模式(作为外设)
当设备作为BLE外设时,会启动广播或接受中心设备的连接,可通过以下两种方式判断:
- 监听BLE广播状态:通过
BluetoothAdvertiser的AdvertiseCallback捕获广播启动成功事件,确认设备处于Peripheral模式活跃状态。 - 监听GattServer连接状态:通过
BluetoothGattServerCallback捕获中心设备的连接状态,当存在活跃的GattServer连接时,说明设备正在以Peripheral模式工作。
代码示例:
// 监听BLE广播状态 BluetoothAdvertiser advertiser = BluetoothAdapter.getDefaultAdapter().getBluetoothLeAdvertiser(); AdvertiseSettings advertiseSettings = new AdvertiseSettings.Builder() .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_POWER) .setConnectable(true) .build(); AdvertiseData advertiseData = new AdvertiseData.Builder() .setIncludeDeviceName(true) .build(); AdvertiseCallback advertiseCallback = new AdvertiseCallback() { @Override public void onStartSuccess(AdvertiseSettings settingsInEffect) { super.onStartSuccess(settingsInEffect); // BLE广播启动成功,设备当前处于Peripheral模式 } @Override public void onStartFailure(int errorCode) { super.onStartFailure(errorCode); // 广播启动失败,可根据errorCode排查原因 } }; // 启动广播时触发上述回调 advertiser.startAdvertising(advertiseSettings, advertiseData, advertiseCallback); // 监听GattServer连接状态 BluetoothGattServerCallback gattServerCallback = new BluetoothGattServerCallback() { @Override public void onConnectionStateChange(BluetoothDevice device, int status, int newState) { super.onConnectionStateChange(device, status, newState); if (newState == BluetoothProfile.STATE_CONNECTED) { // 有中心设备连接,设备当前处于Peripheral模式 } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { // 连接断开,需检查是否存在其他活跃的GattServer连接 } } }; // 打开GattServer时触发上述回调 BluetoothManager bluetoothManager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE); BluetoothGattServer gattServer = bluetoothManager.openGattServer(context, gattServerCallback);
注意事项
- 权限要求:
- Android 12及以上:需要申请
BLUETOOTH_SCAN、BLUETOOTH_ADVERTISE、BLUETOOTH_CONNECT权限,部分场景还需ACCESS_FINE_LOCATION权限。 - Android 11及以下:需要申请
BLUETOOTH、BLUETOOTH_ADMIN、ACCESS_FINE_LOCATION权限。
- Android 12及以上:需要申请
- 蓝牙状态检查:操作前需通过
BluetoothAdapter.isEnabled()确认蓝牙已开启,未开启时可引导用户开启。 - 多模式共存:设备可能同时处于Central和Peripheral模式(如一边扫描一边广播),需分别监听两种模式的状态。
内容的提问来源于stack exchange,提问作者qasim butt
相关产品推荐
相关产品推荐

