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

