本帖最后由 bluebanboom 于 2017-9-24 20:34 编辑
树莓3带有蓝牙芯片,AndroidThings本身也支持蓝牙,之前研究了不少BLE板子,这次在AndroidThings上再来看看如何使用蓝牙。由于对安卓不是很熟,所以一步一步的来吧,先实现一个简单的BLE设备搜索功能。
AndroidThings就是安卓,在之前的试用中已经提及了。因为AndroidThings是基于最新的Android O,API有一些变化,但大致还是差不多的。
1.检查设备是否支持蓝牙
虽然rpi3肯定支持了,但是还是按部就班的来检查一下吧,使用如下代码检查:
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
Toast.makeText(this, "do not support ble",Toast.LENGTH_SHORT).show();
Log.i(TAG, "onCreate: do not support ble");
}
2.获取BluetoothAdapter及BluetoothLeScanner
Adapter是安卓里一个重要的概念,我们是需要通过BluetoothAdapter来进行蓝牙操作的,因为这次主要研究蓝牙设备扫描,所以主要是用BluetoothLeScanner。
final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, 11);
}
mLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
3.ScanCallback处理扫描结果mLeScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
BluetoothDevice dev = result.getDevice();
if (dev != null) {
addToDeviceList(dev);
}
}
@Override
public void onBatchScanResults(List results) {
super.onBatchScanResults(results);
for (ScanResult result : results) {
BluetoothDevice dev = result.getDevice();
if (dev != null) {
addToDeviceList(dev);
}
}
}
@Override
public void onScanFailed(int errorCode) {
super.onScanFailed(errorCode);
Log.i(TAG, "onBatchScanResults: " + "failed");
}
};
4.获取权限
因为要使用蓝牙所以需要在manifest中增加一下几个权限:
5.开始扫描
private void scanLeDevice(final boolean enable) {
if (enable) {
// Stops scanning after a pre-defined scan period.
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mScanning = false;
mLeScanner.stopScan(mLeScanCallback);
}
}, SCAN_PERIOD);
mScanning = true;
mLeScanner.startScan(mLeScanCallback);
} else {
mScanning = false;
mLeScanner.stopScan(mLeScanCallback);
}
}
还是拿小钢炮来测试一下扫描结果,如下所示:
本帖最后由 bluebanboom 于 2017-9-24 20:34 编辑
树莓3带有蓝牙芯片,AndroidThings本身也支持蓝牙,之前研究了不少BLE板子,这次在AndroidThings上再来看看如何使用蓝牙。由于对安卓不是很熟,所以一步一步的来吧,先实现一个简单的BLE设备搜索功能。
AndroidThings就是安卓,在之前的试用中已经提及了。因为AndroidThings是基于最新的Android O,API有一些变化,但大致还是差不多的。
1.检查设备是否支持蓝牙
虽然rpi3肯定支持了,但是还是按部就班的来检查一下吧,使用如下代码检查:
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
Toast.makeText(this, "do not support ble",Toast.LENGTH_SHORT).show();
Log.i(TAG, "onCreate: do not support ble");
}
2.获取BluetoothAdapter及BluetoothLeScanner
Adapter是安卓里一个重要的概念,我们是需要通过BluetoothAdapter来进行蓝牙操作的,因为这次主要研究蓝牙设备扫描,所以主要是用BluetoothLeScanner。
final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, 11);
}
mLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
3.ScanCallback处理扫描结果mLeScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
BluetoothDevice dev = result.getDevice();
if (dev != null) {
addToDeviceList(dev);
}
}
@Override
public void onBatchScanResults(List results) {
super.onBatchScanResults(results);
for (ScanResult result : results) {
BluetoothDevice dev = result.getDevice();
if (dev != null) {
addToDeviceList(dev);
}
}
}
@Override
public void onScanFailed(int errorCode) {
super.onScanFailed(errorCode);
Log.i(TAG, "onBatchScanResults: " + "failed");
}
};
4.获取权限
因为要使用蓝牙所以需要在manifest中增加一下几个权限:
5.开始扫描
private void scanLeDevice(final boolean enable) {
if (enable) {
// Stops scanning after a pre-defined scan period.
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mScanning = false;
mLeScanner.stopScan(mLeScanCallback);
}
}, SCAN_PERIOD);
mScanning = true;
mLeScanner.startScan(mLeScanCallback);
} else {
mScanning = false;
mLeScanner.stopScan(mLeScanCallback);
}
}
还是拿小钢炮来测试一下扫描结果,如下所示: