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()
命令。
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()
命令。