HarmonyOS 鸿蒙Next 语音录制audio.AudioCapturer对象不能正常被创建
HarmonyOS 鸿蒙Next 语音录制audio.AudioCapturer对象不能正常被创建
在页面的aboutToAppear()中使用audio.createAudioCapturer()创建audio.AudioCapturer对象,在页面的aboutToDisappear()中释放audio.AudioCapturer对象。
问题:在页面第一次打开时audio.AudioCapturer对象不能被正常创建,将页面退出后重新进入,
audio.AudioCapturer对象可以被正常创建
//配置音频采集参数并创建AudioCapturer实例
static async init(): Promise<void> {
RecordManager.audioCapturer2 = await audio.createAudioCapturer(RecordManager.audioCapturerOptions)
if (RecordManager.audioCapturer2 !== undefined) {
YTLog.info('调试-Invoke createAudioCapturer succeeded.');
RecordManager.onReadData()
}
}
async aboutToAppear(): Promise<void>{
await RecordManager.init() //打开采集器
}
import { audio } from '@kit.AudioKit';
import { abilityAccessCtrl, common, Permissions } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
const permissions: Array<Permissions> = ['ohos.permission.MICROPHONE'];
@Entry
@Component
struct Index {
@State message: string = 'Hello World';
// 使用UIExtensionAbility:将common.UIAbilityContext 替换为common.UIExtensionContext
reqPermissionsFromUser(permissions: Array<Permissions>, context: common.UIAbilityContext): void {
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
// requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
atManager.requestPermissionsFromUser(context, permissions).then(async (data) => {
let grantStatus: Array<number> = data.authResults;
let length: number = grantStatus.length;
for (let i = 0; i < length; i++) {
if (grantStatus[i] === 0) {
// 用户授权,可以继续访问目标操作
await this.init() //打开采集器
} else {
// 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限
return;
}
}
// 授权成功
}).catch((err: BusinessError) => {
console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
})
}
//配置音频采集参数并创建AudioCapturer实例
async init(): Promise<void> {
let audioStreamInfo: audio.AudioStreamInfo = {
samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_48000, // 采样率
channels: audio.AudioChannel.CHANNEL_2, // 通道
sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 采样格式
encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 编码格式
};
let audioCapturerInfo: audio.AudioCapturerInfo = {
source: audio.SourceType.SOURCE_TYPE_MIC,
capturerFlags: 0
};
let audioCapturerOptions: audio.AudioCapturerOptions = {
streamInfo: audioStreamInfo,
capturerInfo: audioCapturerInfo
};
audio.createAudioCapturer(audioCapturerOptions, (err, data) => {
if (err) {
console.error(`Invoke createAudioCapturer failed, code is ${err.code}, message is ${err.message}`);
} else {
console.info('Invoke createAudioCapturer succeeded.');
let audioCapturer = data;
}
});
}
async aboutToAppear(): Promise<void>{
const context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
this.reqPermissionsFromUser(permissions, context);
}
build() {
RelativeContainer() {
Text(this.message)
.id('HelloWorld')
.fontSize(50)
.fontWeight(FontWeight.Bold)
.alignRules({
center: { anchor: '__container__', align: VerticalAlign.Center },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
})
.onClick(async ()=>{
await this.init() //打开采集器
})
}
.height('100%')
.width('100%')
}
}
针对您提到的HarmonyOS鸿蒙Next系统中,语音录制功能中audio.AudioCapturer
对象无法正常被创建的问题,这通常与权限配置、系统API使用不当或设备兼容性有关。以下是一些可能的排查方向:
-
权限检查:确保您的应用已在
config.json
中正确声明了录音权限(如ohos.permission.RECORD_AUDIO
),并在运行时请求了这些权限。 -
API调用:验证
audio.AudioCapturer
的创建代码是否符合最新的API文档规范,包括参数设置和异常处理。 -
设备兼容性:检查您的代码是否考虑了不同设备的硬件差异和系统版本差异,特别是在鸿蒙系统的不同版本间可能存在API行为的变化。
-
日志分析:查看系统日志和应用日志,寻找与
AudioCapturer
创建失败相关的错误信息,这有助于定位问题根源。 -
官方文档与示例:参考华为官方文档和开发者社区中的示例代码,确保您的实现方式符合最佳实践。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。