HarmonyOS鸿蒙Next中获取音频输入输出设备的名称不对

HarmonyOS鸿蒙Next中获取音频输入输出设备的名称不对 我用以下代码打印音频输入输出设备的名称,但是感觉不太对:

let p_AdoRoutingManager = audio.getAudioManager().getRoutingManager();

let p_AdoInptDvcInfoArrPt = p_AdoRoutingManager.getDevicesSync( audio.DeviceFlag.INPUT_DEVICES_FLAG );
let p_AdoOtptDvcInfoArrPt = p_AdoRoutingManager.getDevicesSync( audio.DeviceFlag.OUTPUT_DEVICES_FLAG );

for( let i = 0; i < p_AdoInptDvcInfoArrPt.length; i++ )
{
    console.info( "AdoInptDvcInfo  id:" + p_AdoInptDvcInfoArrPt[i].id + "  name:" + p_AdoInptDvcInfoArrPt[i].name + "  displayName:" + p_AdoInptDvcInfoArrPt[i].displayName + "  deviceType:" + p_AdoInptDvcInfoArrPt[i].deviceType + "  address:" + p_AdoInptDvcInfoArrPt[i].address );
}

for( let i = 0; i < p_AdoOtptDvcInfoArrPt.length; i++ )
{
    console.info( "AdoOtptDvcInfo  id:" + p_AdoOtptDvcInfoArrPt[i].id + "  name:" + p_AdoOtptDvcInfoArrPt[i].name + "  displayName:" + p_AdoOtptDvcInfoArrPt[i].displayName + "  deviceType:" + p_AdoOtptDvcInfoArrPt[i].deviceType + "  address:" + p_AdoOtptDvcInfoArrPt[i].address );
}

打印出的结果如下:

02-05 23:14:52.234   44773-46118   A03D00/com.exa...onytest/JSAPP  com.examp...monytest  I     AdoInptDvcInfo  id:5  name:  displayName:nova 12 Pro  deviceType:7  address:
02-05 23:14:52.234   44773-46118   A03D00/com.exa...onytest/JSAPP  com.examp...monytest  I     AdoInptDvcInfo  id:2  name:  displayName:nova 12 Pro  deviceType:15  address:
02-05 23:14:52.234   44773-46118   A03D00/com.exa...onytest/JSAPP  com.examp...monytest  I     AdoOtptDvcInfo  id:6  name:  displayName:nova 12 Pro  deviceType:8  address:
02-05 23:14:52.234   44773-46118   A03D00/com.exa...onytest/JSAPP  com.examp...monytest  I     AdoOtptDvcInfo  id:4  name:  displayName:nova 12 Pro  deviceType:7  address:
02-05 23:14:52.234   44773-46118   A03D00/com.exa...onytest/JSAPP  com.examp...monytest  I     AdoOtptDvcInfo  id:3  name:  displayName:nova 12 Pro  deviceType:1  address:
02-05 23:14:52.234   44773-46118   A03D00/com.exa...onytest/JSAPP  com.examp...monytest  I     AdoOtptDvcInfo  id:1  name:  displayName:nova 12 Pro  deviceType:2  address:

1、这个name变量怎么都是空的?

2、这个displayName变量怎么全是“nova 12 Pro”?就连deviceType是7和8的蓝牙音频设备也是这个名称,难道不应该是显示蓝牙的名称吗?

3、我要获取蓝牙音频设备的名称要怎么做呢?


更多关于HarmonyOS鸿蒙Next中获取音频输入输出设备的名称不对的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

针对音频设备名称获取问题的解答

  1. name字段为空的原因

设计规范要求:鸿蒙音频框架中,AudioDeviceInfo.name字段为系统保留属性(如内部设备节点标识),开发者禁止直接使用。该字段通常返回空值,应用层应改用displayName或deviceType判断设备类型。

正确做法:避免使用name字段,改用deviceType区分设备类型(如蓝牙、扬声器等)。

  1. displayName全为设备型号的原因

-系统默认行为:当设备未主动上报自定义名称时,鸿蒙系统会回退到设备型号(如“nova 12 Pro”)。蓝牙设备未返回预期名称的常见原因包括: –权限缺失:未申请蓝牙设备发现权限。 –设备未激活:蓝牙设备未处于音频传输状态(如未播放音频)。 –系统限制:部分蓝牙设备需通过系统服务获取名称,非音频模块职责。

  1. 获取蓝牙设备名称的正确方案

需结合蓝牙模块(@kit.ConnectivityKit)与音频模块协同操作:

步骤一:声明蓝牙权限

在module.json5中添加:

"requestPermissions": [
  {
    "name": "ohos.permission.USE_BLUETOOTH",
    "reason": "获取蓝牙设备名称"
  },
  {
    "name": "ohos.permission.DISCOVER_BLUETOOTH"
  }
]

步骤二:匹配蓝牙设备与音频设备

import bluetooth from '[@kit](/user/kit).ConnectivityKit';
import audio from '[@kit](/user/kit).AudioKit';

// 获取已连接蓝牙设备列表
let btDevices = bluetooth.getConnectedDevicesSync(bluetooth.ProfileId.A2DP); // A2DP为音频协议

// 获取音频设备列表
let audioManager = audio.getAudioManager();
let routingManager = audioManager.getRoutingManager();
let audioDevices = routingManager.getDevicesSync(
  audio.DeviceFlag.INPUT_DEVICES_FLAG | audio.DeviceFlag.OUTPUT_DEVICES_FLAG
);

// 匹配蓝牙设备名称
audioDevices.forEach((audioDevice) => {
  if (audioDevice.deviceType === audio.DeviceType.BLUETOOTH_A2DP ||
      audioDevice.deviceType === audio.DeviceType.BLUETOOTH_SCO) {
    // 通过MAC地址匹配
    const btDevice = btDevices.find(d => d.address === audioDevice.address);
    if (btDevice) {
      console.info("蓝牙设备名称: " + btDevice.deviceName); // 正确获取名称
    }
  }
});

关键点说明

字段 作用 获取方式
address 设备MAC地址(唯一标识) 音频设备audioDevice.address
deviceName 蓝牙设备自定义名称 蓝牙设备btDevice.deviceName
匹配依据 MAC地址完全匹配 确保两模块获取的address一致

注意事项

1.蓝牙状态检查:操作前调用bluetooth.getState()确认蓝牙已开启。 2.设备激活要求:蓝牙耳机需处于播放音频状态才能被识别为音频设备。 3.错误处理:若address为空,检查是否遗漏DISCOVER_BLUETOOTH权限。 4.设备类型对照表:

deviceType值 设备类型
7 蓝牙A2DP输入
8 蓝牙A2DP输出
15 蓝牙SCO通话

更多关于HarmonyOS鸿蒙Next中获取音频输入输出设备的名称不对的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


真的是权限的问题,添加了ohos.permission.USE_BLUETOOTH权限后就能显示名称了。

真的是权限的问题,添加了ohos.permission.USE_BLUETOOTH权限后就能显示名称了。

02-06 13:03:10.964   6226-6575     A03D00/com.exa...onytest/JSAPP  com.examp...monytest  I     AdoInptDvcInfo  id:33  name:J92  displayName:nova 12 Pro  deviceType:7  address:19:8D:7F:BA:94:84
02-06 13:03:10.964   6226-6575     A03D00/com.exa...onytest/JSAPP  com.examp...monytest  I     AdoInptDvcInfo  id:29  name:G2  displayName:nova 12 Pro  deviceType:7  address:B5:38:7F:04:6A:71
02-06 13:03:10.964   6226-6575     A03D00/com.exa...onytest/JSAPP  com.examp...monytest  I     AdoInptDvcInfo  id:2  name:  displayName:nova 12 Pro  deviceType:15  address:
02-06 13:03:10.964   6226-6575     A03D00/com.exa...onytest/JSAPP  com.examp...monytest  I     AdoOtptDvcInfo  id:32  name:J92  displayName:nova 12 Pro  deviceType:7  address:19:8D:7F:BA:94:84
02-06 13:03:10.964   6226-6575     A03D00/com.exa...onytest/JSAPP  com.examp...monytest  I     AdoOtptDvcInfo  id:31  name:J92  displayName:nova 12 Pro  deviceType:8  address:19:8D:7F:BA:94:84
02-06 13:03:10.964   6226-6575     A03D00/com.exa...onytest/JSAPP  com.examp...monytest  I     AdoOtptDvcInfo  id:30  name:G2  displayName:nova 12 Pro  deviceType:8  address:B5:38:7F:04:6A:71
02-06 13:03:10.964   6226-6575     A03D00/com.exa...onytest/JSAPP  com.examp...monytest  I     AdoOtptDvcInfo  id:28  name:G2  displayName:nova 12 Pro  deviceType:7  address:B5:38:7F:04:6A:71
02-06 13:03:10.964   6226-6575     A03D00/com.exa...onytest/JSAPP  com.examp...monytest  I     AdoOtptDvcInfo  id:3  name:  displayName:nova 12 Pro  deviceType:1  address:
02-06 13:03:10.964   6226-6575     A03D00/com.exa...onytest/JSAPP  com.examp...monytest  I     AdoOtptDvcInfo  id:1  name:  displayName:nova 12 Pro  deviceType:2  address:

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

看着代码是没有问题的

系统权限缺失或设备状态判断失误导致的

在HarmonyOS Next中,音频设备名称获取异常通常与系统音频服务或设备描述符映射有关。请检查是否使用了正确的AudioManager API接口,并确认设备枚举时获取的描述信息是否完整。设备名称可能受系统本地化设置或底层驱动上报信息影响。

在HarmonyOS Next中,AudioDeviceInfoname字段通常用于内部标识,可能为空是预期行为。displayName字段在部分设备(尤其是蓝牙设备)上可能默认返回设备型号而非具体设备名称,这是当前系统的设计逻辑。

要获取蓝牙音频设备的准确名称,建议使用[@ohos](/user/ohos).bluetooth接口。具体步骤如下:

  1. 获取已连接的蓝牙音频设备列表

    import { bluetooth } from '[@ohos](/user/ohos).bluetooth';
    
    let profileIds = [bluetooth.HandsFreeAudioGateway.HFP, bluetooth.A2dpSource.A2DP];
    let devices = bluetooth.getProfileConnectedDevices(profileIds);
    
  2. 遍历设备列表并获取设备名称

    devices.forEach(device => {
      console.info("Bluetooth device name: " + device.deviceName);
      console.info("Bluetooth device address: " + device.address);
    });
    
  3. 将蓝牙地址与音频设备信息关联: 通过对比AudioDeviceInfo.address(如果蓝牙设备已连接,该字段可能包含蓝牙MAC地址)与bluetooth.Device.address,可以建立对应关系,从而获取到正确的设备名称。

这种方法可以直接从蓝牙管理模块获取到用户可识别的设备名称,比音频路由接口返回的信息更准确。

回到顶部