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

系统应用调用SpeechRecognition遇RECORD_AUDIO权限拒绝问题

问题分析

这个错误的核心原因是:你的系统应用(uid 1000)调用Google语音识别代理包com.google.android.katniss时,代理包本身未被授予RECORD_AUDIO权限,且系统应用的权限无法直接传递给第三方代理进程。Debug模式下正常是因为debug环境中代理包的权限限制被放宽,或是你的debug包使用了不同的签名/uid配置。

解决方案

1. 直接使用系统内置语音识别服务(推荐)

系统应用可绕过第三方代理,直接绑定系统原生语音识别服务,避免权限传递问题。修改Intent,指定系统语音识别组件的包名:

val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply {
    // 根据你的系统调整组件包名/类名,示例为系统设置内置服务
    component = ComponentName("com.android.settings", "com.android.settings.widget.SpeechRecognitionHandler")
    putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
    putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true)
    putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS, 3500)
}
lazySpeechRecognizer.value.startListening(intent)

若不清楚系统内置服务的组件名,可通过以下adb命令查询:

adb shell pm query-intents --action android.speech.action.RECOGNIZE_SPEECH

2. 为代理包授予录音权限(仅测试用)

如果只是临时调试验证,可通过adb命令直接给com.google.android.katniss授予权限:

adb shell pm grant com.google.android.katniss android.permission.RECORD_AUDIO

注意:该方法仅适用于本地测试,无法适配用户设备。

3. 调整系统应用权限声明

确保Manifest中正确配置权限,且应用已完成系统签名:

  • 声明必要权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
  • 配置系统共享UID:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:sharedUserId="android.uid.system">
    <!-- 其他配置项 -->
</manifest>

系统签名后的应用会自动获取RECORD_AUDIO权限,无需动态申请,可移除代码中的动态权限请求逻辑,直接调用语音识别API。

4. 筛选系统签名的语音识别服务

通过代码过滤出系统签名的语音识别服务,避免调用第三方代理:

val pm = requireContext().packageManager
val resolveInfoList = pm.queryIntentServices(Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0)
// 筛选系统签名的服务
val systemService = resolveInfoList.firstOrNull {
    val info = it.serviceInfo
    pm.checkSignatures(info.packageName, "android") == PackageManager.SIGNATURE_MATCH
}
systemService?.let {
    val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply {
        component = ComponentName(it.serviceInfo.packageName, it.serviceInfo.name)
        // 填充语音识别参数
        putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
        putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true)
    }
    lazySpeechRecognizer.value.startListening(intent)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:36:33