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

Android BLE外设广告本地名称设置:不修改设备蓝牙名实现方案

在Android中单独设置BLE广告本地名称(不修改设备蓝牙系统名称)

嗨,我完全懂你的困扰——用BluetoothAdapter.setName()会把整个设备的蓝牙名称改掉,这确实不是做BLE外设广告时想要的结果。好在Android里完全能实现和iOS类似的效果:单独定义广告里显示的本地名称,完全不触动系统层面的蓝牙名称。

核心思路

关键在于彻底摆脱对系统设备名称的依赖:

  1. 绝对不要调用BluetoothAdapter.setName(name)修改全局名称
  2. 不要在AdvertiseData.Builder里加setIncludeDeviceName(true)(这个方法会自动把系统蓝牙名称塞进广告数据)
  3. 手动构造BLE广告中的「本地名称」AD字段,直接添加到自定义广告数据中

具体实现代码

BLE广告里的「完整本地名称」对应的AD类型是0x09,我们需要严格按照BLE广告数据格式构造原始字节数组,再把它加入广告数据:

import java.nio.charset.StandardCharsets;
import android.bluetooth.le.AdvertiseData;
import android.bluetooth.le.AdvertiseSettings;
import android.bluetooth.le.BluetoothLeAdvertiser;
import android.os.ParcelUuid;

// 你想要在广告中显示的自定义名称
String customAdvName = "MyCustomBLEPeriph";

// 构造BLE广告的原始本地名称字段
byte[] nameBytes = customAdvName.getBytes(StandardCharsets.UTF_8);
// BLE广告字段格式:[长度字节][AD类型][名称字节]
// 长度 = AD类型(1字节) + 名称字节的长度
byte[] rawNameField = new byte[1 + 1 + nameBytes.length];
rawNameField[0] = (byte) (1 + nameBytes.length); // 设置长度字节
rawNameField[1] = (byte) 0x09; // AD类型:0x09代表「完整本地名称」
// 把名称字节复制到数组中
System.arraycopy(nameBytes, 0, rawNameField, 2, nameBytes.length);

// 构建自定义广告数据
AdvertiseData advertiseData = new AdvertiseData.Builder()
        // 千万不要加这行:.setIncludeDeviceName(true)
        .addRawData(rawNameField) // 添加我们自定义的本地名称字段
        // 可选:添加你的BLE服务UUID(如果外设需要提供服务的话)
        .addServiceUuid(new ParcelUuid(yourServiceUuid))
        .build();

// 构建广告设置(根据你的需求调整模式、发射功率等)
AdvertiseSettings advertiseSettings = new AdvertiseSettings.Builder()
        .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED)
        .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM)
        .setConnectable(true) // 如果是可连接的外设,设为true
        .build();

// 启动BLE广告
BluetoothLeAdvertiser advertiser = BluetoothAdapter.getDefaultAdapter().getBluetoothLeAdvertiser();
if (advertiser != null) {
    advertiser.startAdvertising(advertiseSettings, advertiseData, yourAdvertiseCallback);
}

注意事项

  • 广告长度限制:BLE单包广告数据最多31字节,所以自定义名称不能太长,如果名称过长,可以改用0x08类型的「短本地名称」来截断适配
  • 验证方式:用专业的BLE扫描工具(比如nRF Connect)查看广告名称,不要看系统蓝牙设置里的设备名称——那还是原来的系统名称,这正是我们想要的效果
  • 兼容性:这种方式在Android 5.0(API 21)及以上版本都能正常工作,覆盖了绝大多数支持BLE的设备

这样操作后,你的BLE外设会在广告中显示自定义名称,而设备本身的蓝牙系统名称完全不受影响,和iOS的实现逻辑完全一致。

内容的提问来源于stack exchange,提问作者YUSMLE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:59:10