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
相关产品推荐
相关产品推荐

