如何让Android应用被识别为BLE蓝牙外围设备?
Android BLE外围设备(Peripheral)实现指南
我完全理解你想把Android App做成BLE外围设备却无法被扫描到的困扰——BLE外围模式的配置确实有几个容易踩的坑,尤其是新手第一次接触的时候。下面我会一步步帮你梳理完整的实现流程,以及排查常见问题的方法:
一、先搞定权限配置(重中之重)
Android不同版本对BLE权限的要求差异很大,一定要根据目标版本配置正确:
1. 在Manifest中声明权限
<!-- 基础BLE权限(适配Android 11及以下) --> <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" /> <!-- Android 12+ 专属权限 --> <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <!-- 可选:如果需要后台扫描/广播,Android 12+ 需添加 --> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" /> <!-- 声明App依赖BLE硬件 --> <uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
2. 运行时动态申请权限
Android 12+ 必须在运行时主动请求蓝牙权限,否则广播会直接失败:
private val REQUEST_BLUETOOTH_PERMISSIONS = 1001 fun requestBluetoothPermissions() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { val permissions = arrayOf( Manifest.permission.BLUETOOTH_ADVERTISE, Manifest.permission.BLUETOOTH_CONNECT ) ActivityCompat.requestPermissions(this, permissions, REQUEST_BLUETOOTH_PERMISSIONS) } }
二、检查设备兼容性
不是所有Android设备都能作为BLE外围设备,先做前置检查:
val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager val bluetoothAdapter = bluetoothManager.adapter // 检查蓝牙是否开启,未开启则引导用户打开 if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled) { val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE) startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT) return } // 检查设备是否支持BLE外围模式 if (!bluetoothAdapter.isMultipleAdvertisementSupported) { Toast.makeText(this, "当前设备不支持BLE外围模式", Toast.LENGTH_SHORT).show() return }
三、构建广播配置与数据(核心环节)
这是最容易出错的地方,必须正确配置广播参数和内容,否则扫描设备无法识别:
1. 创建广播参数(AdvertiseSettings)
val advertiseSettings = AdvertiseSettings.Builder() .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY) // 低延迟模式,适合测试 .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH) // 高发射功率,扩大扫描范围 .setConnectable(true) // 设置为可连接(如果你的设备需要被连接交互) .build()
2. 创建广播数据(AdvertiseData)
重点:一定要添加自定义服务UUID! 大部分扫描App会过滤带有服务UUID的设备,没有UUID的话可能不会显示你的设备:
// 自定义一个服务UUID(可以用在线UUID生成器生成专属ID) val serviceUuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB") val advertiseData = AdvertiseData.Builder() .setIncludeDeviceName(true) // 包含设备名称(可选,方便识别) .addServiceUuid(ParcelUuid(serviceUuid)) // 添加服务UUID(关键!) .build()
四、启动BLE广播
通过BluetoothLeAdvertiser启动广播,并监听回调结果:
val advertiser = bluetoothAdapter.bluetoothLeAdvertiser val advertiseCallback = object : AdvertiseCallback() { override fun onStartSuccess(settingsInEffect: AdvertiseSettings?) { super.onStartSuccess(settingsInEffect) Toast.makeText(this@MainActivity, "BLE广播启动成功", Toast.LENGTH_SHORT).show() } override fun onStartFailure(errorCode: Int) { super.onStartFailure(errorCode) val errorMsg = when(errorCode) { ADVERTISE_FAILED_ALREADY_STARTED -> "广播已在运行中" ADVERTISE_FAILED_DATA_TOO_LARGE -> "广播数据超出长度限制" ADVERTISE_FAILED_FEATURE_UNSUPPORTED -> "设备不支持该广播特性" ADVERTISE_FAILED_INTERNAL_ERROR -> "系统内部错误" ADVERTISE_FAILED_TOO_MANY_ADVERTISERS -> "同时广播的设备数量超限" else -> "未知错误:$errorCode" } Toast.makeText(this@MainActivity, "广播启动失败:$errorMsg", Toast.LENGTH_SHORT).show() } } // 启动广播 advertiser.startAdvertising(advertiseSettings, advertiseData, advertiseCallback)
五、常见问题排查
如果还是无法被扫描到,试试这些排查步骤:
- 检查扫描设备的过滤规则:有些扫描App默认只显示可连接设备,或需要手动添加你的服务UUID才能识别
- 关闭其他BLE相关App:Android系统同一时间只允许一个BLE广播实例运行,其他App可能占用了资源
- 缩短设备名称:BLE广播的设备名称不能超过16字节,过长会被截断导致无法识别
- 切换广播模式:如果
LOW_LATENCY模式不行,试试ADVERTISE_MODE_BALANCED或ADVERTISE_MODE_LOW_POWER - 用自定义扫描工具测试:可以用Android官方的
BluetoothLeScanner写一个简单的扫描App,避免第三方工具的过滤限制
内容的提问来源于stack exchange,提问作者Harsh Shah
相关产品推荐
相关产品推荐

