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

Android如何扫描获取未配对蓝牙设备列表?

扫描未配对蓝牙设备的实现方案

Android 平台实现

权限准备

Android 不同版本对蓝牙扫描的权限要求不同:

  • Android 11 及以下:需要 ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION,以及 BLUETOOTH、BLUETOOTH_ADMIN 权限
  • Android 12+:新增 BLUETOOTH_SCAN 权限(无需位置权限,但若要扫描非BLE设备仍需位置权限)

在 AndroidManifest.xml 中声明权限:

<!-- 基础蓝牙权限 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- 位置权限(Android 11及以下/扫描传统蓝牙设备需要) -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- Android 12+ 扫描权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />

同时需动态申请危险权限(位置、BLUETOOTH_SCAN)。

扫描未配对设备

  1. 获取 BluetoothAdapter 实例:
BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()) {
    // 蓝牙未启用,引导用户开启
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
    return;
}
  1. 注册广播接收器接收扫描结果:
private final BroadcastReceiver bluetoothReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            // 获取扫描到的未配对设备
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            String deviceName = device.getName();
            String deviceAddress = device.getAddress();
            // 处理设备信息(如加入列表)
        }
    }
};
  1. 注册接收器并启动扫描:
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(bluetoothReceiver, filter);
// 启动传统蓝牙扫描(扫描所有可见未配对设备)
bluetoothAdapter.startDiscovery();
  1. 扫描完成后停止扫描并注销接收器:
bluetoothAdapter.cancelDiscovery();
unregisterReceiver(bluetoothReceiver);

iOS 平台实现

权限准备

在 Info.plist 中添加蓝牙权限描述:

<key>NSBluetoothAlwaysUsageDescription</key>
<string>需要蓝牙权限扫描附近设备</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>需要蓝牙权限扫描附近设备</string>

若需后台扫描,需开启 Background Modes 中的 Uses Bluetooth LE accessories。

扫描未配对设备

  1. 导入 CoreBluetooth 并实现代理:
import CoreBluetooth

class BluetoothScanner: NSObject, CBCentralManagerDelegate {
    private var centralManager: CBCentralManager!
    
    override init() {
        super.init()
        centralManager = CBCentralManager(delegate: self, queue: DispatchQueue.main)
    }
    
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        switch central.state {
        case .poweredOn:
            // 蓝牙已开启,开始扫描
            // nil 表示扫描所有BLE设备,可传入特定服务UUID过滤
            centralManager.scanForPeripherals(withServices: nil, options: [CBCentralManagerScanOptionAllowDuplicatesKey: false])
        case .poweredOff:
            // 蓝牙未开启,引导用户开启
            break
        default:
            break
        }
    }
    
    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
        // 获取扫描到的未配对设备信息
        let deviceName = peripheral.name ?? "未知设备"
        let deviceUUID = peripheral.identifier.uuidString
        // 处理设备信息(如加入列表)
    }
}
  1. 启动扫描:
let scanner = BluetoothScanner()
  1. 停止扫描:
centralManager.stopScan()

通用注意事项

  • 扫描操作会消耗较多电量,完成扫描后务必及时停止
  • Android 中 startDiscovery() 扫描持续时间约12秒,可通过 cancelDiscovery() 提前终止
  • iOS 中扫描到的设备可能包含已配对设备,可通过 peripheral.state 判断是否已配对

内容的提问来源于stack exchange,提问作者Mohib Ul Rehman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:30:23