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

如何在Android中通过ScanRecord.getAdvertisingDataMap获取BLE Appearance?

解答:Android端BLE设备Appearance数据获取

关于ScanRecord.DATA_TYPE_APPEARANCE的真实性

Bard的说法完全错误,ScanRecord.DATA_TYPE_APPEARANCE是Android官方SDK中存在的合法常量,对应BLE广播数据里的Appearance数据类型(0x19),完全可以用来从getAdvertisingDataMap()中提取Appearance字段。

你的实现思路分析与优化

你的代码整体方向正确,但有一个关键细节需要修正:Java/Kotlin中的byte是有符号类型(范围-128~127),直接用appearanceBytes[0] * 256会因符号扩展导致计算错误(比如高位字节为0x80及以上时,会被解析为负数)。

修正后的代码如下:

int getAppearance(ScanResult result) {
  ScanRecord scanRecord = result.getScanRecord();
  if (scanRecord == null) return 0;
  
  Map<Integer, byte[]> advertisingDataMap = scanRecord.getAdvertisingDataMap();
  int appearance = 0;
  if (advertisingDataMap.containsKey(ScanRecord.DATA_TYPE_APPEARANCE)) {
    byte[] appearanceBytes = advertisingDataMap.get(ScanRecord.DATA_TYPE_APPEARANCE);
    // 将有符号byte转为无符号值,再按大端字节序计算16位整数
    appearance = ((appearanceBytes[0] & 0xFF) << 8) | (appearanceBytes[1] & 0xFF);
  }

  return appearance;
}

补充说明

  • BLE的Appearance字段是16位无符号整数,遵循大端字节序(高位字节在前),代码中先处理第一个字节(高位)、再处理第二个字节(低位)的逻辑正确。
  • 必须做空值判断:scanRecord可能为null,提前处理可避免空指针异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 23:25:01