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
针对音频设备名称获取问题的解答
- name字段为空的原因
设计规范要求:鸿蒙音频框架中,AudioDeviceInfo.name字段为系统保留属性(如内部设备节点标识),开发者禁止直接使用。该字段通常返回空值,应用层应改用displayName或deviceType判断设备类型。
正确做法:避免使用name字段,改用deviceType区分设备类型(如蓝牙、扬声器等)。
- displayName全为设备型号的原因
-系统默认行为:当设备未主动上报自定义名称时,鸿蒙系统会回退到设备型号(如“nova 12 Pro”)。蓝牙设备未返回预期名称的常见原因包括: –权限缺失:未申请蓝牙设备发现权限。 –设备未激活:蓝牙设备未处于音频传输状态(如未播放音频)。 –系统限制:部分蓝牙设备需通过系统服务获取名称,非音频模块职责。
- 获取蓝牙设备名称的正确方案
需结合蓝牙模块(@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中,AudioDeviceInfo的name字段通常用于内部标识,可能为空是预期行为。displayName字段在部分设备(尤其是蓝牙设备)上可能默认返回设备型号而非具体设备名称,这是当前系统的设计逻辑。
要获取蓝牙音频设备的准确名称,建议使用[@ohos](/user/ohos).bluetooth接口。具体步骤如下:
-
获取已连接的蓝牙音频设备列表:
import { bluetooth } from '[@ohos](/user/ohos).bluetooth'; let profileIds = [bluetooth.HandsFreeAudioGateway.HFP, bluetooth.A2dpSource.A2DP]; let devices = bluetooth.getProfileConnectedDevices(profileIds); -
遍历设备列表并获取设备名称:
devices.forEach(device => { console.info("Bluetooth device name: " + device.deviceName); console.info("Bluetooth device address: " + device.address); }); -
将蓝牙地址与音频设备信息关联: 通过对比
AudioDeviceInfo.address(如果蓝牙设备已连接,该字段可能包含蓝牙MAC地址)与bluetooth.Device.address,可以建立对应关系,从而获取到正确的设备名称。
这种方法可以直接从蓝牙管理模块获取到用户可识别的设备名称,比音频路由接口返回的信息更准确。

