Android ble蓝牙开发流程
时间: 2025-01-04 11:26:09 浏览: 8
### Android 平台下BLE(低功耗蓝牙)开发流程
#### 设备支持检测
为了确保应用程序能够在目标设备上正常运行,首先要确认该设备是否具备蓝牙功能。这一步骤中会使用 `BluetoothAdapter` 类来表示本地设备的蓝牙适配器[^3]。
```java
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, REQUEST_ENABLE_BT);
}
```
#### 初始化并启动扫描
一旦确定了设备具有可用的蓝牙能力,则可以初始化蓝牙LE扫描过程。此阶段同样依赖于 `BluetoothAdapter` 来发起对周围蓝牙LE设备的查找请求[^2]。
```java
private final BluetoothAdapter.LeScanCallback mLeScanCallback =
new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi,
byte[] scanRecord) {
runOnUiThread(new Runnable() {
@Override
public void run() {
// 更新UI显示找到的新设备信息
}
});
}
};
public void startScanning(){
mBluetoothAdapter.startLeScan(mLeScanCallback);
}
public void stopScanning(){
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
```
#### 建立连接与服务发现
当用户选择了某个特定的目标设备之后,程序需要尝试与其建立稳定的数据链路,并在此基础上执行服务发现操作以获取可交互的服务列表及其特征值集合[^4]。
```java
mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState){
if(newState==BluetoothProfile.STATE_CONNECTED){
Log.i(TAG,"Connected to GATT server.");
gatt.discoverServices();
}else if(newState==BluetoothProfile.STATE_DISCONNECTED){
Log.i(TAG,"Disconnected from GATT server.");
}
}
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status){
if(status==BluetoothGatt.GATT_SUCCESS){
displayGattServices(gatt.getSupportedUUIDs());
}
}
};
```
#### 数据读写通信
完成上述准备工作后就可以针对具体的服务和特性来进行实际的数据交换活动了。对于某些类型的属性还可以设置通知机制以便实时接收来自远端节点的变化事件更新[^1]。
```java
BluetoothGattCharacteristic characteristic;
// 设置为指示模式或通知模式
characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT);
boolean enabled = characteristic.setValue(value)
&& mBluetoothGatt.writeCharacteristic(characteristic);
```
#### 断开连接及资源释放
最后,在不再需要维持当前链接的情况下应当及时调用相应的API方法终止会话并且清理占用的相关硬件接口实例对象,防止内存泄漏等问题的发生[^5]。
```java
@Override
public boolean onUnbind(Intent intent) {
close();
return super.onUnbind(intent);
}
private synchronized void close() {
if (mBluetoothGatt == null) {
return;
}
mBluetoothGatt.close();
mBluetoothGatt = null;
}
```
阅读全文