You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查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);

注意事项

  1. 权限要求:
    • Android 12及以上:需要申请BLUETOOTH_SCAN、BLUETOOTH_ADVERTISE、BLUETOOTH_CONNECT权限,部分场景还需ACCESS_FINE_LOCATION权限。
    • Android 11及以下:需要申请BLUETOOTH、BLUETOOTH_ADMIN、ACCESS_FINE_LOCATION权限。
  2. 蓝牙状态检查:操作前需通过BluetoothAdapter.isEnabled()确认蓝牙已开启,未开启时可引导用户开启。
  3. 多模式共存:设备可能同时处于Central和Peripheral模式(如一边扫描一边广播),需分别监听两种模式的状态。

内容的提问来源于stack exchange,提问作者qasim butt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:48:15