跳到主要内容

获取设备详情

读取 AIBuds 设备当前可用的信息。设备详情以设备对象属性的形式公开;SDK 不提供单一的 getDeviceDetails 请求或 DeviceDetails 结果模型。

通过 DeviceConvertible 读取标识、固件、连接和广播信息。如果设备同时符合 DeviceInfoAPI,还可读取电池状态、设备能力、硬件配置、语言设置、通话状态、存储信息和媒体数量。

前置条件

读取设备详情前:

  • 从扫描、已保存设备或连接流程中获取 DeviceConvertible 实例。
  • 需要设备最新上报值时,请等待设备进入已连接且就绪状态。
  • 在 SDK 或设备提供可选属性前,应将其视为不可用。

:::info 当前快照 读取这些属性不会发送蓝牙命令。这些值表示 SDK 的当前快照,可能来自发现数据、持久化设备数据或活动连接期间收到的信息。 :::

API 参考

框架

AIBuds.xcframework

导入

在需要使用 SDK 的文件中导入主框架:

Swift
import AIBuds

协议

设备详情由两个协议公开。DeviceConvertible 提供基础设备快照;连接设备支持 DeviceInfoAPI 时,该协议提供更多设备信息属性。

Swift
/// Defines the persistent identity and capabilities of an AIBuds device.
protocol DeviceConvertible: NSObjectProtocol, NSSecureCoding

/// The protocol for device information related API.
protocol DeviceInfoAPI: DeviceAPI

属性

基础设备属性

以下属性由 DeviceConvertible 提供。

类别属性说明
标识name, uuid, bluetoothName, macAddress, productSDK 当前已知的设备名称和标识符。
硬件deviceModel, deviceSerialNum, formatedProjNumber受支持设备上报的可选值。
固件firmwareVersion, formatedFirmwareVersion, coProcessorFirmwareVersionformatedFirmwareVersion 是 Demo 用于界面显示的主固件版本字符串。
连接connectionState, deviceState, isConnectedAndReady, isBusy, lastConnectTime依赖实时设备状态前,请检查 isConnectedAndReady
绑定bindUserId, userBindTime, isAlreadyUnbind, shouldAutoReconnectWhenAppLaunchSDK 维护的绑定和重连状态。
广播advertisementDataString, advertisementRawData, manufacturerData, manufacturerHexDataString, timestampOfAdvertisementData从最近一次收到的广播数据中派生的值。
展示thumbnail, screenName, customContent宿主 App UI 可使用的可选值。

设备信息属性

确认设备支持 DeviceInfoAPI 后,可以读取以下扩展快照值。

属性类型描述
batteryStatusInfoBatteryStatusModel?设备各电池组件的实时信息。
deviceCapabilitiesDeviceCapabilities?设备上报的标准化功能标志;收到有效能力信息前为 nil
hardwareConfigurationDeviceHardwareConfiguration设备上报的物理输入硬件和设备端引导要求。
languageSettingDeviceLanguage设备当前语言。
supportedLanguages[NSNumber]设备支持的 DeviceLanguage 原始值。
callStatusCallStatus当前通话状态。
storageInfoStorageInfoModel?以 MB 为单位的已用和可用存储空间。
mediaCountInfoMediaCountInfoModel?照片、视频和音频文件数量。
isSupportAdjustRecordDurationBool是否支持配置最大录音时长。
aiSolutionCapabilitiesAIBudsAISolutionCapabilities设备上报的 AI 能力。
coprocessorModelCoprocessorModel设备协处理器型号。
imageEnhancementPostProcessingAlgorithmImageEnhancementPostProcessingAlgorithm设备当前上报的图像增强后处理算法;默认为 .general
recommendedMaxVideoRecordingDurationOptions[NSNumber]设备建议的视频最大录制时长档位(分钟);默认为 [1, 3, 9, 12]
recommendedMaxAudioRecordingDurationOptions[NSNumber]设备建议的音频最大录制时长档位(分钟);默认为 [30, 60, 120]
minimumBatteryLevelForMediaOperationsInt照片、视频、音频和文件传输所需的最低电量百分比;默认为 30。OTA 使用独立规则。

常见状态值

batteryStatusInfo 可能包含产品支持的任意电池组件:

BatteryComponent含义
.glass眼镜主体
.leftEarbud / .rightEarbud左耳机或右耳机
.chargingCase充电盒
.mainSpeaker / .sideSpeaker主扬声器或侧扬声器
.headphones头戴式耳机
.unknown组件不可用或无法识别

使用 deviceCapabilities 中的字段判断是否开放 TWS、空间音频、多点连接、ANC、设备端语音助手、低音引擎、直播流、喜马拉雅或工厂测试啁啾提示音。不要仅根据 product 推断这些功能。值为 nil 表示 SDK 尚未收到有效能力信息,并不表示所有功能都不受支持。

hardwareConfiguration 描述产品的操作方式:

属性含义
hasTouchInput设备配备触摸输入区域。
hasPhysicalButtonInput设备配备物理按键输入。
requiresOnDeviceVoiceAssistantGuidance宿主 App 应提供设备端语音助手的使用引导。

callStatus 使用 CallStatus

含义
.notInCall当前没有通话。
.ringing来电正在响铃。
.inCall当前正在通话。
.threeWayRinging支持时,表示三方通话正在响铃。
.aiChat设备将 AI 对话报告为当前通话通道活动。
.unknown通话状态不可用或无法识别。

使用示例

读取设备详情

以下示例采用 SDK Demo 中 DeviceInfoDetailsController 的处理方式:先读取基础设备属性,再按协议支持情况加入 DeviceInfoAPI 属性。

Swift
import AIBuds

typealias DeviceDetail = (label: String, value: String)

func formattedDate(_ date: Date?, unavailable: String) -> String {
    guard let date else { return unavailable }

    let formatter = DateFormatter()
    formatter.dateStyle = .medium
    formatter.timeStyle = .medium
    return formatter.string(from: date)
}

func deviceDetails(for device: DeviceConvertible) -> [DeviceDetail] {
    let unavailable = "N/A"
    var details: [DeviceDetail] = [
        ("Device Name", device.name),
        ("UUID", device.uuid.uuidString),
        ("Bluetooth Name", device.bluetoothName ?? unavailable),
        ("MAC Address", device.macAddress ?? unavailable),
        ("Product", String(describing: device.product)),
        ("Device Model", device.deviceModel ?? unavailable),
        ("Serial Number", device.deviceSerialNum ?? unavailable),
        ("Firmware Version", device.formatedFirmwareVersion ?? unavailable),
        ("Co-processor Firmware", device.coProcessorFirmwareVersion ?? unavailable),
        ("Project Number", device.formatedProjNumber ?? unavailable),
        ("Last Connection", formattedDate(device.lastConnectTime, unavailable: unavailable)),
        ("Auto Reconnect", device.shouldAutoReconnectWhenAppLaunch ? "Yes" : "No"),
        ("Advertisement Data", device.advertisementDataString ?? unavailable),
        ("Manufacturer Data", device.manufacturerHexDataString ?? unavailable),
        (
            "Advertisement Timestamp",
            formattedDate(device.timestampOfAdvertisementData, unavailable: unavailable)
        ),
        ("Screen Name", device.screenName ?? unavailable),
        ("Custom Content", device.customContent ?? unavailable),
    ]

    guard let info = device as? DeviceInfoAPI else {
        return details
    }

    let supportedLanguages = info.supportedLanguages
        .compactMap { DeviceLanguage(rawValue: $0.intValue) }
        .map { String(describing: $0) }
        .joined(separator: ", ")

    details.append(contentsOf: [
        ("Battery Status", info.batteryStatusInfo?.description ?? unavailable),
        ("Device Capabilities", info.deviceCapabilities?.description ?? unavailable),
        ("Hardware Configuration", info.hardwareConfiguration.description),
        ("Language", String(describing: info.languageSetting)),
        ("Supported Languages", supportedLanguages.isEmpty ? unavailable : supportedLanguages),
        ("Call Status", String(describing: info.callStatus)),
        ("Storage", info.storageInfo?.description ?? unavailable),
        ("Media Count", info.mediaCountInfo?.description ?? unavailable),
        ("Adjustable Recording Duration", info.isSupportAdjustRecordDuration ? "Yes" : "No"),
        ("AI Capabilities", String(describing: info.aiSolutionCapabilities)),
        ("Co-processor Model", String(describing: info.coprocessorModel)),
        (
            "Image Enhancement",
            String(describing: info.imageEnhancementPostProcessingAlgorithm)
        ),
        ("Recommended Video Duration Options", info.recommendedMaxVideoRecordingDurationOptions.description),
        ("Recommended Audio Duration Options", info.recommendedMaxAudioRecordingDurationOptions.description),
        ("Minimum Media Battery", "\(info.minimumBatteryLevelForMediaOperations)%"),
    ])

    return details
}

请使用应用自己的视图模型和本地化方案渲染返回的数据行。Demo 使用表格视图,并将枚举值转换为本地化显示文本。

刷新存储或媒体信息

storageInfomediaCountInfo 是快照属性。如果界面需要最新值,请先请求更新,并在操作成功后读取对应属性。

Swift
guard let info = device as? DeviceInfoAPI else { return }

info.requestQueryStorageInfo { success, error in
    guard success else {
        print(error?.localizedDescription ?? "Storage query failed")
        return
    }

    print(info.storageInfo?.description ?? "Storage information is unavailable")
}

Swift 调用 requestQueryMediaCountInfo(_:),Objective-C 调用 requestQueryMediaCountInfoWithCompletion:,以便在需要时刷新 mediaCountInfo

错误处理

读取属性本身不会返回异步错误。显式刷新操作通过完成回调报告失败。处理不可用信息时:

  1. 需要实时值时检查 device.isConnectedAndReady
  2. 读取 DeviceInfoAPI 属性前确认设备支持该协议。
  3. 正确处理可选属性,不要假设所有设备型号都会上报每个值;应将 nildeviceCapabilities 值视为未知,而不是不支持。
  4. 将广播字段视为最近一次收到的广播快照。
  5. 对存储或媒体数量查询等显式刷新操作处理 successerror

最佳实践

  1. 检查协议支持:读取扩展属性前确认设备支持 DeviceInfoAPI

  2. 按上报值开放功能:优先使用 deviceCapabilities 中的标准化标志、建议录制时长数组和 minimumBatteryLevelForMediaOperations,不要依赖产品名称或硬编码限制。

  3. 将值视为快照:不要假设所有属性在同一时间刷新。

  4. 处理可选值:显示不可用状态,不要编造回退设备数据。

  5. 按需刷新:界面需要当前值时,再调用存储和媒体数量查询方法。

  6. 本地化显示值:将产品、语言、通话状态等枚举转换为面向用户的本地化文本。

注意事项

  • 设备能力和可用字段因产品与固件而异。DeviceProduct.headphones 标识头戴式耳机产品,BatteryComponent.headphones 标识其电池条目。
  • supportedLanguages 包含 NSNumber 值,这些值映射到 DeviceLanguage.rawValue
  • StorageInfoModel 提供 usedSpaceInMBfreeSpaceInMB
  • MediaCountInfoModel 提供 photoCountvideoCountaudioCount
  • UI 需要单独字段时,应优先读取模型属性,不要解析 description