Android 上蓝牙扫描和发现的差异

Difference in Bluetooth scanning and discovery on Android

Android 中定义了两种查找蓝牙设备的方法。 1. 使用 bluetoothAdapter.startScan 2. bluetoothAdapter.discover

哪种方法更好。

第二个问题, onLeScan回调中,如何判断扫描是否已经停止

startScan() 将扫描 LE 设备,startDiscovery() 扫描普通蓝牙设备。

据我所知,只要 stopLeScan()stopScan() 方法被调用,startLeScan()startScan() 就会扫描,您必须调用它们。

我个人使用 BluetoothAdapter 的 startDiscovery() 方法,我使用 Broadcast receiver 来知道我是否有扫描结果,扫描是否停止等。

广播接收器:

BroadcastReceiver scanReceiver = new BroadcastReceiver() {

                @Override
                public void onReceive(Context context, Intent intent) {
                    String action = intent.getAction();
                    if (action.equalsIgnoreCase( BluetoothDevice.ACTION_FOUND)) {
                        // device found

                    } else if (action.equalsIgnoreCase(
                            BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {
                        // discoveryFinished

                    } else if (action.equalsIgnoreCase(
                            BluetoothAdapter.ACTION_DISCOVERY_STARTED)) {
                        // discoveryStarted

                    } 

                }

            };
            IntentFilter filter = new IntentFilter();
            filter.addAction(BluetoothDevice.ACTION_FOUND);
            filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
            filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);

            activity.registerReceiver(scanReceiver, filter);

您应该在开始发现之前注册此广播接收器

这些方法适用于不同版本的蓝牙。使用哪一个取决于你有什么样的设备。

经典蓝牙使用 BluetoothAdapter.startDiscovery() 查找可发现的设备。

在 API 级别 18 中添加了低功耗蓝牙支持,它使用 BluetoothAdapter.startLeScan(ScanCallback)。从 API 级别 21 开始,它被 BluetoothLeScanner.startScan() 取代。

请参阅 this samplecode 了解如何扫描 LE 设备。在 onLeScan 中,如果您找到了设备,只需调用 scanLeDevice(false);

onLeScan 回调不检查扫描是否已停止。你必须自己给出 stopLeScan() 命令。