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

Android 13下Kotlin后台Service语音识别录音几秒即停问题求助

Android 13后台持续录音停止问题解决方案

针对你在Android 13上遇到的后台录音几秒后停止的问题,核心原因确实是系统安全与后台限制机制升级,结合你使用SpeechRecognizer的场景,可从以下几个方向排查修复:

一、权限与前台服务配置补全

Android 13对后台录音和前台服务的约束更严格,需确保以下配置完全正确:

  • Manifest权限声明:
    除了RECORD_AUDIO,必须添加前台服务类型声明,同时申请POST_NOTIFICATIONS权限(Android 13+必填):
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE" />
    
    <service
        android:name=".OverlayService"
        android:foregroundServiceType="microphone"
        android:permission="android.permission.SYSTEM_ALERT_WINDOW" />
    
  • 动态权限申请:
    除了动态请求RECORD_AUDIO,必须主动请求POST_NOTIFICATIONS权限,否则前台服务通知无法显示,系统会终止后台录音:
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        requestPermissions(new String[]{Manifest.permission.POST_NOTIFICATIONS}, 101);
    }
    
  • 前台服务通知必须可见:
    启动前台服务时,通知不能设置为低优先级或隐藏,必须让用户明确感知应用在后台运行:
    Notification notification = new NotificationCompat.Builder(this, "CHANNEL_ID")
            .setContentTitle("实时翻译录音中")
            .setContentText("点击返回应用")
            .setSmallIcon(R.drawable.ic_notification)
            .setPriority(NotificationCompat.PRIORITY_HIGH) // 必须高优先级
            .build();
    startForeground(1, notification);
    

二、替换SpeechRecognizer为原生录音API

SpeechRecognizer是为语音识别会话设计的,内置超时机制(通常10秒左右无输入就会停止),且后台运行时系统会优先回收这类非核心服务,不适合持续录音场景。建议改用AudioRecord实现持续录音:

// 初始化AudioRecord
int sampleRate = 44100;
int channelConfig = AudioFormat.CHANNEL_IN_MONO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
int bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);
AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
        sampleRate, channelConfig, audioFormat, bufferSize);

// 启动录音
audioRecord.startRecording();
// 在子线程中循环读取音频数据
new Thread(() -> {
    byte[] buffer = new byte[bufferSize];
    while (isRecording) {
        int read = audioRecord.read(buffer, 0, bufferSize);
        if (read > 0) {
            // 处理音频数据(传给翻译服务)
        }
    }
    audioRecord.stop();
    audioRecord.release();
}).start();

三、规避系统电池优化

Android 13的电池优化会严格限制后台耗电操作,需引导用户关闭应用的电池优化:

Intent intent = new Intent();
String packageName = getPackageName();
PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
if (!pm.isIgnoringBatteryOptimizations(packageName)) {
    intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
    intent.setData(Uri.parse("package:" + packageName));
    startActivity(intent);
}

四、悬浮窗权限与服务稳定性

确保悬浮窗权限SYSTEM_ALERT_WINDOW已正确获取,虽然这不直接影响录音,但如果应用因悬浮窗权限被限制,可能导致后台服务被系统判定为异常而终止:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {
    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
            Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, 102);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:15:24