如何在Delphi 10.4中正确构建ACTION_RECOGNIZE_SPEECH Intent?
正确构建Android语音识别Intent的Delphi代码
核心问题修正点
ACTION_RECOGNIZE_SPEECH不属于Intent类常量,而是属于android.speech.RecognizerIntent类,需通过TJRecognizerIntent.JavaClass访问。- 语音识别的参数需以键值对形式传入,不能将参数名和值合并为单个字符串。
- 语音识别需要通过
startActivityForResult启动,才能获取识别后的返回结果。
修正后的完整代码
// 需确保已引用 Androidapi.JNI.Speech 单元 procedure TsendForm.Button8Click(Sender: TObject); var Intent: JIntent; PackageManager: JPackageManager; ResolveInfoList: JList; begin // 创建语音识别Intent Intent := TJIntent.JavaClass.init(TJRecognizerIntent.JavaClass.ACTION_RECOGNIZE_SPEECH); // 设置语言模型为自由格式 Intent.putExtra(TJRecognizerIntent.JavaClass.EXTRA_LANGUAGE_MODEL, TJRecognizerIntent.JavaClass.LANGUAGE_MODEL_FREE_FORM); // 可选:设置语音识别提示文本 Intent.putExtra(TJRecognizerIntent.JavaClass.EXTRA_PROMPT, StringToJString('请说出内容')); // 检查设备是否支持语音识别服务 PackageManager := MainActivity.getPackageManager; ResolveInfoList := PackageManager.queryIntentActivities(Intent, TJPackageManager.JavaClass.MATCH_DEFAULT_ONLY); if ResolveInfoList.size > 0 then begin // 启动识别界面,自定义请求码(示例用1001) TAndroidHelper.Activity.startActivityForResult(Intent, 1001); end else begin ShowMessage('设备未安装语音识别服务'); end; end; // 重写Activity的onActivityResult方法,获取语音识别结果 procedure TMainActivity.ActivityResult(RequestCode, ResultCode: Integer; Data: JIntent); var Results: JArrayList; begin inherited; // 匹配请求码和结果状态 if (RequestCode = 1001) and (ResultCode = TJActivity.JavaClass.RESULT_OK) then begin // 获取识别结果列表 Results := Data.getStringArrayListExtra(TJRecognizerIntent.JavaClass.EXTRA_RESULTS); if Results.size > 0 then begin // 取出第一个识别结果展示 ShowMessage(JStringToString(Results.get(0))); end; end; end;
重要注意事项
- 必须在项目中引用
Androidapi.JNI.Speech单元,否则无法调用TJRecognizerIntent相关常量和方法。 - 请求码(示例中的1001)可自定义,只需保证
onActivityResult中的判断逻辑与之一致即可。 - 部分国产设备可能未预装Google语音识别服务,需提示用户安装兼容的语音识别应用。
内容的提问来源于stack exchange,提问作者Winston
相关产品推荐
相关产品推荐

