Android 13中获取Google SpeechRecognizer支持语言的问题求助
Android 13 语音识别支持语言获取问题解决
问题背景
Android 13之前可通过RecognizerIntent.ACTION_GET_LANGUAGE_DETAILS广播接收器获取语音识别支持语言,但Android 13中该广播返回的extras为空;使用Android 13新增的SpeechRecognizer.checkRecognitionSupport() API时,始终触发onError回调,错误码为14,仅三星AiAiSpeechRecognitionService可正常工作。
原因分析
- 广播接口废弃:Android 13开始限制
ACTION_GET_LANGUAGE_DETAILS广播的功能,官方明确要求使用checkRecognitionSupport()API替代旧广播方案。 - 错误码14对应
ERROR_RECOGNIZER_BUSY:表示语音识别服务正忙,或请求参数不合法导致服务无法处理。
解决步骤
1. 确保请求Intent参数合法
checkRecognitionSupport()依赖合法的识别Intent,必须包含EXTRA_LANGUAGE_MODEL等核心参数,否则服务会拒绝处理请求。示例代码:
// 构建合法的测试Intent Intent testIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); // 设置语言模型,必须指定 testIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); // 可选:指定目标语言 testIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault().toLanguageTag()); // 调用API SpeechRecognizer speechRecognizer = SpeechRecognizer.createSpeechRecognizer(context); speechRecognizer.checkRecognitionSupport(testIntent, Executors.newSingleThreadExecutor(), new RecognitionSupportCallback() { @Override public void onSupportResult(@NonNull RecognitionSupport recognitionSupport) { // 获取支持的语言列表 List<Locale> supportedLocales = recognitionSupport.getSupportedLocales(); // 获取偏好语言 Locale preferredLocale = recognitionSupport.getPreferredLocale(); } @Override public void onError(int error) { Log.e(LOG_TAG, "识别支持检查错误: " + error); } });
2. 处理权限与初始化逻辑
- Android 13及以上需要动态申请
RECORD_AUDIO权限,否则语音识别服务无法正常工作:
// 检查并申请权限 if (ContextCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.RECORD_AUDIO}, REQUEST_RECORD_AUDIO); }
- 确保
SpeechRecognizer实例唯一,避免多个实例同时占用服务导致ERROR_RECOGNIZER_BUSY:使用单例模式管理,或在每次调用前销毁旧实例。
3. 适配第三方语音识别服务
部分厂商的语音识别服务可能未完全实现checkRecognitionSupport()接口,可通过以下方式降级处理:
- 查询系统中已安装的语音识别服务组件:
PackageManager pm = context.getPackageManager(); Intent serviceIntent = new Intent(RecognitionService.SERVICE_INTERFACE); List<ResolveInfo> services = pm.queryIntentServices(serviceIntent, 0); for (ResolveInfo info : services) { // 可尝试针对特定服务做适配 String serviceName = info.serviceInfo.name; }
- 提示用户安装官方语音识别服务(如Google语音识别)作为备选方案。
4. 错误码14的额外排查
- 检查是否有其他应用正在使用语音识别服务,导致当前请求被阻塞;
- 重启设备后重试,排除临时服务异常;
- 针对特定设备,查看厂商是否有相关系统设置限制语音识别服务的调用。
内容的提问来源于stack exchange,提问作者Max Shpokha
相关产品推荐
相关产品推荐

