You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android API 31后台启动前台服务:语音服务重启录音权限异常

解决AppOps RECORD_AUDIO 重启唤醒词服务失败问题

问题分析

日志中的Operation not started: uid=xxx op=RECORD_AUDIO错误,核心原因是录音权限会话未正确释放,或服务重启时权限状态未重新校验,导致系统拒绝授予录音权限。

解决方案

  • 彻底释放SpeechRecognizer及音频资源
    SpeechRecognizer结束时,必须完整释放资源,避免占用录音通道:

    if (speechRecognizer != null) {
        speechRecognizer.stopListening();
        speechRecognizer.cancel();
        speechRecognizer.destroy();
        speechRecognizer = null;
    }
    

    若唤醒词服务使用了AudioRecord,停止服务时也需释放:

    if (audioRecord != null) {
        if (audioRecord.getState() == AudioRecord.STATE_INITIALIZED) {
            audioRecord.stop();
            audioRecord.release();
        }
        audioRecord = null;
    }
    
  • 重启前重新校验动态录音权限
    Android 6.0+需动态申请权限,即使Manifest已配置,重启服务前仍需检查权限状态:

    if (ContextCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.RECORD_AUDIO}, 1001);
        return; // 等待权限申请通过后再启动服务
    }
    // 权限验证通过,启动唤醒词服务
    startService(new Intent(context, WakeWordService.class));
    
  • 规范服务生命周期管理
    确保唤醒词服务完全停止后再重启,避免生命周期冲突:

    // 停止唤醒词服务
    stopService(new Intent(context, WakeWordService.class));
    // 延迟1秒重启(若有服务销毁回调,优先用回调触发重启)
    new Handler(Looper.getMainLooper()).postDelayed(() -> {
        startService(new Intent(context, WakeWordService.class));
    }, 1000);
    

    同时确认唤醒词服务启动时调用startForeground(),维持前台状态避免被系统限制。

  • 排查厂商权限限制
    部分厂商系统对后台录音有额外限制,前往应用权限设置,将麦克风权限设置为始终允许,而非“仅使用时允许”,确保后台服务能正常获取录音权限。

内容的提问来源于stack exchange,提问作者diegobfcy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 14:28:10