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)。
扫描未配对设备
- 获取
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; }
- 注册广播接收器接收扫描结果:
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(); // 处理设备信息(如加入列表) } } };
- 注册接收器并启动扫描:
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(bluetoothReceiver, filter); // 启动传统蓝牙扫描(扫描所有可见未配对设备) bluetoothAdapter.startDiscovery();
- 扫描完成后停止扫描并注销接收器:
bluetoothAdapter.cancelDiscovery(); unregisterReceiver(bluetoothReceiver);
iOS 平台实现
权限准备
在 Info.plist 中添加蓝牙权限描述:
<key>NSBluetoothAlwaysUsageDescription</key> <string>需要蓝牙权限扫描附近设备</string> <key>NSBluetoothPeripheralUsageDescription</key> <string>需要蓝牙权限扫描附近设备</string>
若需后台扫描,需开启 Background Modes 中的 Uses Bluetooth LE accessories。
扫描未配对设备
- 导入
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 // 处理设备信息(如加入列表) } }
- 启动扫描:
let scanner = BluetoothScanner()
- 停止扫描:
centralManager.stopScan()
通用注意事项
- 扫描操作会消耗较多电量,完成扫描后务必及时停止
- Android 中
startDiscovery()扫描持续时间约12秒,可通过cancelDiscovery()提前终止 - iOS 中扫描到的设备可能包含已配对设备,可通过
peripheral.state判断是否已配对
内容的提问来源于stack exchange,提问作者Mohib Ul Rehman
相关产品推荐
相关产品推荐

