看官们,我们在上一章回中介绍了BLE开发中蓝牙扫描前的准备工作,本章回中我们将介绍BLE开发中的"蓝牙扫描设备",闲话休提,言归正转。让我们一起Talk Android吧!
我们在本章回中通过代码结合文本的方式介绍如何扫描蓝牙设备,下面是官方文档中给出的示例代码:
public class DeviceScanActivity extends ListActivity {
private BluetoothAdapter bluetoothAdapter;
private boolean mScanning;
private Handler handler;
// Stops scanning after 10 seconds.
private static final long SCAN_PERIOD = 10000;
...
private void scanLeDevice(final boolean enable) {
if (enable) {
// Stops scanning after a pre-defined scan period.
handler.postDelayed(new Runnable() {
@Override
public void run() {
mScanning = false;
bluetoothAdapter.stopLeScan(leScanCallback);
}
}, SCAN_PERIOD);
mScanning = true;
bluetoothAdapter.startLeScan(leScanCallback);
} else {
mScanning = false;
bluetoothAdapter.stopLeScan(leScanCallback);
}
...
}
...
}
该代码使用了BluetoothAdapter的startLeScan方法实现扫描工作,并且定义了一个扫描时间,如果超过该时间会自动停止扫描;这么做是为了节省电量,因为扫描操作非常消耗电量,而且官方对扫描操作给了以下建议:
找到所需设备后,立即停止扫描。
绝对不进行循环扫描,并设置扫描时间限制。之前可用的设备可能已超出范围,继续扫描会耗尽电池电量。
有看官问代码中使用的BluetoothAdapter如何才能获取到?可以参考以下代码:
BluetoothManager bluetoothManager =
(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
bluetoothAdapter = bluetoothManager.getAdapter();
BluetoothAdapter是一个非常重要的类,我们打开系统蓝牙开关时也会使用它。
使用BluetoothAdapter的startLeScan方法时最重要的是它的参数,该参数是一个LeScanCallback类型的变量,我们需要实现其中的方法,详细的代码(参考官方文档)如下:
private BluetoothAdapter.LeScanCallback leScanCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi,
byte[] scanRecord) {
//do something. such as get device
}
});
}
};
在实现LeScanCallback的onLeScan方法时,我可以通过该方法的参数得到当前扫描到的蓝牙设备:device,如果扫描不到任何设备,参数值为空。device是BluetoothDevice类型的对象,它里面包含了蓝牙设备的名称和地址。这是非常有用的信息。另外一个参数rssi表示蓝牙设备的信号强度,这个是一个参考值,不一定很准确,它会随着设备的角度不同而变化。
看官们,Android在扫描蓝牙时使用了回调函数这种设计方式,我们使用一个方法进行扫描,该方法只负责扫描,扫描的结果却放在回调方法里,希望大家能够从整体的角度来理解这种设计方式。
各位看官,关于Android中蓝牙扫描设备的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!