android studio 低功率蓝牙app
时间: 2025-05-23 17:17:28 浏览: 13
### 开发低功耗蓝牙(BLE)应用的关键步骤
#### 1. 配置 `AndroidManifest.xml` 文件
为了支持 BLE 功能,需要在项目的 `AndroidManifest.xml` 文件中声明必要的权限和特性。以下是必需的配置项:
- 声明设备支持 BLE 特性并设置为强制要求:
```xml
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
```
- 添加基本的蓝牙权限以及管理权限:
```xml
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
```
- 如果目标 API 级别为 21 或更高,则还需要位置权限来扫描附近的 BLE 设备[^1]:
```xml
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
```
对于 Android 12 及以上版本,还需额外添加以下权限以连接到特定设备[^2]:
```xml
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
```
#### 2. 初始化蓝牙适配器
通过系统的 `BluetoothManager` 获取默认的蓝牙适配器实例,并验证其可用状态。
```kotlin
val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
private var mBluetoothAdapter: BluetoothAdapter? = bluetoothManager.adapter
if (mBluetoothAdapter == null || !mBluetoothAdapter!!.isEnabled) {
// 蓝牙不可用或未启用
}
```
如果蓝牙尚未开启,可以通过发送意图请求用户手动打开蓝牙服务:
```kotlin
if (!mBluetoothAdapter!!.isEnabled) {
val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT)
}
```
#### 3. 扫描附近 BLE 设备
要发现周围的 BLE 设备,可以调用 `startLeScan()` 方法启动扫描过程。此方法接受一个回调接口作为参数,用于处理扫描结果。
```kotlin
// 定义 LE 扫描回调函数
private val leScanCallback: BluetoothAdapter.LeScanCallback =
object : BluetoothAdapter.LeScanCallback {
override fun onLeScan(device: BluetoothDevice?, rssi: Int, scanRecord: ByteArray?) {
Log.d("BLE", "Found device ${device?.name} with RSSI $rssi")
}
}
// 启动扫描
mBluetoothAdapter?.startLeScan(leScanCallback)
// 停止扫描
mBluetoothAdapter?.stopLeScan(leScanCallback)
```
注意:从 Android 5.0(API Level 21)起推荐使用更现代的 `BluetoothLeScanner` 接口替代旧版 `startLeScan()`. 这种方式提供了更多高级选项如周期性和过滤条件[^1].
#### 4. 处理运行时权限
自 Android 6.0 (API Level 23)以来,某些敏感操作需动态申请权限。例如访问精确位置数据前应先确认已获授权:
```kotlin
if (ContextCompat.checkSelfPermission(
this,
Manifest.permission.ACCESS_FINE_LOCATION
) != PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
LOCATION_PERMISSION_REQUEST_CODE
)
}
```
#### 5. 数据交互与 GATT 协议
当成功建立连接后可通过通用属性协议(Generic Attribute Profile,GATT)实现双向通信。具体涉及读取特征值(characteristic),写入命令或者订阅通知等功能:
```kotlin
bluetoothGatt.readCharacteristic(characteristic)
characteristic.value = byteArrayOf(0x01, 0x02)
bluetoothGatt.writeCharacteristic(characteristic)
```
---
###
阅读全文
相关推荐


















