最近项目上需要修改锁具名称,然后扫描显示最新名称,大部分手机都是可以直接扫描到,广播里直接获取到最新的名称(bluetoothDevice.getName()),但是有个同事的三星手机,广播却不是最新的名称,重启后,才能显示最新的,自己解析 发现是最新的名称,所以改完需要自己来解析。如下: public static String parseDeviceName(byte[] scanRecord) { String ret = null; if (null == scanRecord) { return ret; } ByteBuffer buffer = ByteBuffer.wrap(scanRecord).order(ByteOrder.LITTLE_ENDIAN); while (buffer.remaining() > 2) { byte length = buffer.get(); if (length == 0) break; byte type = buffer.get(); length -= 1; switch (type) { case 0x01: // Flags buffer.get(); // flags length--; break; case 0x02: // Partial list of 16-bit UUIDs case 0x03: // Complete list of 16-bit UUIDs case 0x14: // List of 16-bit Service Solicitation UUIDs while (length >= 2) { buffer.getShort(); length -= 2; } break; case 0x04: // Partial list of 32 bit service UUIDs case 0x05: // Complete list of 32 bit service UUIDs while (length >= 4) { buffer.getInt(); length -= 4; } break; case 0x06: // Partial list of 128-bit UUIDs case 0x07: // Complete list of 128-bit UUIDs case 0x15: // List of 128-bit Service Solicitation UUIDs while (length >= 16) { long lsb = buffer.getLong(); long msb = buffer.getLong(); length -= 16; } break; case 0x08: // Short local device name case 0x09: // Complete local device name byte sb[] = new byte[length]; buffer.get(sb, 0, length); length = 0; ret = new String(sb).trim(); return ret; case (byte) 0xFF: // Manufacturer Specific Data buffer.getShort(); length -= 2; break; default: // skip break; } if (length > 0) { buffer.position(buffer.position() + length); } } return ret; }
部分蓝牙手机,修改了设备名称后,广播扫到的不是最新名称
于 2022-11-16 12:00:29 首次发布
本文探讨了在Android系统中遇到的一个特定问题,即在三星手机上,蓝牙设备名称无法通过常规方法获取更新。作者提供了一个静态方法`parseDeviceName`用于解析扫描记录以获取正确的设备名称。此方法适用于当标准API无法返回最新名称的情况,特别是在广播数据中解析设备名称的场景。
摘要由CSDN通过智能技术生成