HarmonyOS鸿蒙Next中软件启动音频输入时中途锁屏就Dead了,怎么回事?
HarmonyOS鸿蒙Next中软件启动音频输入时中途锁屏就Dead了,怎么回事? 软件启动后,点击“启动音频输入:通话来源或麦克风来源”,然后按下电源键锁屏,软件就Dead了,怎么回事?
按电源键锁屏后直接 dead,更像是音频采集、XComponent 绘制和页面生命周期没解耦。锁屏后页面可能进入后台或 surface 不再可用,如果 readData 回调里还继续驱动 UI 绘制、访问 XComponent/surface,就容易出现 native 侧异常或资源失效。
建议先这样拆:1. readData 回调只做音频数据入队,不要直接在回调里画波形;2. 页面 onPageHide/onBackground/锁屏后暂停绘制,前台回来再重新绑定 XComponent;3. 如果业务要求锁屏继续采集,要申请合适的长时任务/后台音频场景,并确认麦克风采集在该场景允许;4. 打开 DevEco Log 或 hdc hilog 看首个 crash/fatal 栈,只贴脱敏后的错误码和栈顶即可;5. 先把“采集不绘制”和“绘制假数据”分别跑通,就能定位是 AudioCapturer 还是渲染链路导致。
更多关于HarmonyOS鸿蒙Next中软件启动音频输入时中途锁屏就Dead了,怎么回事?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
已经找到原因了,鸿蒙系统会在应用进入后台录音时强制终止进程,需要应用启动后台持续运行backgroundTaskManager.startBackgroundRunning才不会被强制终止。
学习了
已经找到原因了,鸿蒙系统会在应用进入后台录音时强制终止进程,需要应用启动后台持续运行backgroundTaskManager.startBackgroundRunning才不会被强制终止。
大概率是出现在这一行错误:
//设置音频输入设备的回调函数。
this.m_AudioCapturerPt.on( 'readData', ( buffer: ArrayBuffer ) =>
{
this.m_AdoWavFmPt?.Draw( buffer, buffer.byteLength / 2, this.m_AdoInptXComponentIdStrPt, null );
let p_AdoInptRoutedDevicesPt = this.m_AudioCapturerPt?.getCurrentInputDevices();
let p_AdoInptRoutedDevicePt = ( p_AdoInptRoutedDevicesPt != null ) ? ( ( p_AdoInptRoutedDevicesPt.length > 0 ) ? p_AdoInptRoutedDevicesPt[ 0 ] : null ) : null;
this.m_CurAdoInptDvc = ( ( p_AdoInptRoutedDevicePt != null ) ? ( GetAdoDvcInfoTypeName( p_AdoInptRoutedDevicePt.deviceType ) + p_AdoInptRoutedDevicePt.name ) : "空" );
} );
当开始录音之后,按下电源键锁屏是无法继续录音的。
你这个on回调没有处理null数据吧!
这个回调还有null数据的情况吗?你确定吗?buffer: ArrayBuffer这个类型里可没有null
总的来说,HarmonyOS是一款非常优秀的操作系统,期待它能在未来带给我们更多惊喜!
这个软件莫名其妙的dead了,有没有哪里有日志可以看的?
我把函数体里的代码全部注释了,还是dead。
在HarmonyOS Next中,锁屏后应用进入后台,音频输入资源可能被系统回收。原因通常是音频会话未正确处理锁屏状态切换,或未注册系统生命周期回调导致崩溃。需检查AudioCapturer是否在锁屏时未正常释放或重连,以及Ability的onInactive/onBackground事件是否合理管理音频流。
原因在于锁屏后系统会挂起应用,未配置后台音频输入长时任务时,音频会话被强制中断导致进程终止。使用通话来源音频流还需要系统权限,权限不足也会直接崩溃。需注册长时任务(backgroundTaskManager申请音频类型),并在AudioSession中设置后台并发策略(CONCURRENCY_BACK_GROUND),同时监听onInterrupt事件处理音频焦点丢失与恢复。麦克风来源也需在锁屏后保持音频会话激活,否则进程同样会被冻结或杀死。,

