You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:45:14