Android FastBle 教程

本文介绍了如何在Android4.3及以上版本中集成和管理低功耗蓝牙(BLE)功能,包括配置权限、检测设备支持、设置和扫描蓝牙设备,以及连接蓝牙设备的基本步骤。
摘要由CSDN通过智能技术生成

一、概述


Android 4.3(API 级别 18)引入了内置平台支持低功耗蓝牙(BLE)的核心角色,并提供应用程序可用于发现设备,查询服务和传输信息的API。

与经典蓝牙(Classic Bluetooth)相比,低功耗蓝牙(BLE)旨在提供显着降低的功耗。这允许 Android 应用程序与具有更严格电源要求的 BLE 设备通信,例如接近传感器,心率监视器和健身设备。

二、配置 BLE 权限


1. 配置定位权限

由于 LE Beacons 通常与位置相关联。要在 BluetoothLeScanner 没有过滤器的情况下使用,您必须通过声明应用程序清单文件中的权限 ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION 权限来请求用户的权限。没有这些权限,扫描将不会返回任何结果。

// MainActivity.java

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M

&& checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED

&& checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

requestLocationPermission();

} else {

initBluetooth();

}

2. 配置蓝牙权限

要在您的应用程序中使用蓝牙功能,您必须声明蓝牙权限 BLUETOOTH。您需要此权限才能执行任何蓝牙通信,例如请求连接,接受连接和传输数据。

如果您希望应用启动设备发现或操作蓝牙设置,则还必须声明 BLUETOOTH_ADMIN 权限。注意:如果您使用 BLUETOOTH_ADMIN 权限,则您还必须拥有 BLUETOOTH 权限。

如果您要声明您的应用仅适用于支持 BLE 的设备,请在应用的清单中包含以下 BLE 权限:

但是一般来说,蓝牙只是应用程序的一个小功能,所以我们只会在使用到蓝牙功能时,去检查 BLE 是否可用,所以并不需要上述 BLE 权限,取而代之的是使用时检查:

// MainActivity.java

private void initBluetooth() {

// Use this check to determine whether BLE is supported on the device. Then you can

// selectively disable BLE-related features.

// 检查当前手机是否支持 ble 蓝牙

if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {

Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();

return; // or finish();

}

}

三、设置 BLE


如果不支持 BLE,则应优雅地禁用任何 BLE 功能。如果 BLE 受支持但已禁用,则可以请求用户启用蓝牙而无需离开您的应用程序。这个设置分两步完成,使用 BluetoothAdapter。

1. 获取 BluetoothAdapter

// MainActivity.java

private BluetoothAdapter mBluetoothAdapter;

// Initializes a Bluetooth adapter. For API level 18 and above, get a reference to

// BluetoothAdapter through BluetoothManager.

// 初始化 Bluetooth adapter, 通过蓝牙管理器得到一个参考蓝牙适配器(API必须在以上android4.3或以上和版本)

final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);

mBluetoothAdapter = bluetoothManager.getAdapter();

2. 开启蓝牙

// MainActivity.java

private static final int REQUEST_ENABLE_BT = 1;

// Checks if Bluetooth is supported on the device.

// 检查设备上是否支持蓝牙

if (mBluetoothAdapter == null) {

Toast.makeText(this, R.string.error_bluetooth_not_supported, Toast.LENGTH_SHORT).show();

return; // or finish();

}

// Ensures Bluetooth is enabled on the device. If Bluetooth is not currently enabled,

// fire an intent to display a dialog asking the user to grant permission to enable it.

// 检查蓝牙是否开启

if (!mBluetoothAdapter.isEnabled()) {

if (!mBluetoothAdapter.isEnabled()) {

Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);

return;

}

}

// MainActivity.java

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (requestCode == REQUEST_ENABLE_BT) {

// User chose not to enable Bluetooth.

if (resultCode == Activity.RESULT_CANCELED) {

ToastUtils.showShort(R.string.please_open_bluetooth_to_use_ble_function);

} else if (resultCode == Activity.RESULT_OK) {

ToastUtils.showShort(R.string.start_scanning_bluetooth_device);

// 扫描蓝牙设备

}

}

super.onActivityResult(requestCode, resultCode, data);

}

四、初始化 BleManager


引入 FastBle:compile ‘com.clj.fastble:FastBleLib:1.2.1’

BleManager.getInstance().init(getApplication());

BleManager.getInstance()

.enableLog(true)

.setReConnectCount(1, 5000)

.setConnectOverTime(20000)

.setOperateTimeout(5000);

如果需要设备扫描规则:

BleScanRuleConfig scanRuleConfig = new BleScanRuleConfig.Builder()

.setServiceUuids(serviceUuids)

.setDeviceName(true, names)

.setDeviceMac(mac)

.setAutoConnect(isAutoConnect)

.setScanTimeOut(10000)

.build();

BleManager.getInstance().initScanRule(scanRuleConfig);

五、扫描蓝牙设备


private void startScan() {

BleManager.getInstance().scan(new BleScanCallback() {

@Override

public void onScanStarted(boolean success) {

mBluetoothQuickAdapter.setNewData(new ArrayList());

img_loading.startAnimation(operatingAnim);

img_loading.setVisibility(View.VISIBLE);

}

@Override

public void onLeScan(BleDevice bleDevice) {

super.onLeScan(bleDevice);

}

@Override

public void onScanning(BleDevice bleDevice) {

mBluetoothQuickAdapter.addData(bleDevice);

}

@Override

public void onScanFinished(List scanResultList) {

img_loading.clearAnimation();

img_loading.setVisibility(View.INVISIBLE);

}

});

}

六、连接蓝牙设备


连接蓝牙后,如果需要往指定的 Characteristic UUID 中,写入一定的开锁指令,可使用以下方法连接蓝牙、搜索指定 UUID:

private void connect(final BleDevice bleDevice) {

BleManager.getInstance().connect(bleDevice, new BleGattCallback() {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

学习分享

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021最新上万页的大厂面试真题

image

七大模块学习资料:如NDK模块开发、Android框架体系架构…

image

2021大厂面试真题:

image

只有系统,有方向的学习,才能在短时间内迅速提高自己的技术,只有不断地学习,不懈的努力才能拥有更好的技术,才能在互联网行业中立于不败之地。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021最新上万页的大厂面试真题

[外链图片转存中…(img-tlyKEQZ7-1712504080933)]

七大模块学习资料:如NDK模块开发、Android框架体系架构…

[外链图片转存中…(img-YMtVUP3e-1712504080934)]

2021大厂面试真题:

[外链图片转存中…(img-W17m9eDA-1712504080934)]

只有系统,有方向的学习,才能在短时间内迅速提高自己的技术,只有不断地学习,不懈的努力才能拥有更好的技术,才能在互联网行业中立于不败之地。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值