Flutter:speech_to_text在Android API31模拟器初始化失败
以下是针对你遇到问题的具体排查方向:
检查AndroidManifest的包可见性声明
API 30及以上系统限制了应用对其他应用的可见性,speech_to_text需要调用系统语音识别服务,必须在AndroidManifest.xml的<manifest>标签内添加以下queries配置:<queries> <intent> <action android:name="android.speech.RecognitionService" /> </intent> </queries>缺少这个声明会导致插件无法找到系统语音识别服务,直接初始化失败。
查看初始化错误信息
不要只判断初始化是否成功,要捕获插件返回的具体错误:final speech = SpeechToText(); bool available = await speech.initialize( onError: (errorDetails) => print("初始化错误: ${errorDetails.errorMsg}"), onStatus: (status) => print("状态变化: $status"), );比如错误信息是
no_speech_recognizers_available,说明系统没有可用的语音识别器。确认模拟器是否带Google服务(GMS)
纯AOSP版本的模拟器默认没有Google语音识别服务,而Chrome网页端依赖Web Speech API不受此限制。建议切换到带Google Play的Pixel C API 31镜像,或者在模拟器中安装Google语音搜索应用。验证模拟器麦克风的实际可用性
即使权限显示开启,也可能存在硬件连接问题:- 打开模拟器自带的「录音机」APP,尝试录制音频;
- 检查模拟器设置→系统→语言和输入法→语音,是否有可用的语音识别引擎;
- 确认电脑麦克风正常工作,且模拟器音频设置中选择了正确的输入设备。
检查动态权限申请逻辑
虽然模拟器权限显示正常,但确保代码中在初始化前已正确申请RECORD_AUDIO权限。可以手动触发权限检查:import 'package:permission_handler/permission_handler.dart'; Future<bool> checkMicPermission() async { var status = await Permission.microphone.status; if (!status.isGranted) { status = await Permission.microphone.request(); } return status.isGranted; }先调用这个函数确认权限后,再初始化speech_to_text。
检查插件与Flutter版本兼容性
确认你使用的speech_to_text版本支持API 31,同时Flutter版本建议升级到3.0及以上,避免旧版本与Android 12(API31)的兼容性问题。排查混淆规则(若开启混淆)
如果你的项目启用了代码混淆,需在proguard-rules.pro中添加插件的保留规则:-keep class com.google.android.gms.speech.** { *; } -keep class com.csdcorp.speech_to_text.** { *; }防止插件核心类被混淆导致初始化失败。
内容的提问来源于stack exchange,提问作者Mereva

