android - 从 Android 中的 onActivityResult 中提示语音识别

标签 android voice-recognition

我希望我说得够清楚了。

在我的应用程序中,我已将其设置为按下后退按钮可激活谷歌的语音识别服务。在 onActivityResult 中,它会检查第一个单词是“call”还是“text”,然后相应地处理其余的口语句子。具体对于文本,它类似于“文本 [联系人姓名] 消息 [消息内容]”,然后使用 smsManager 发送它。但是由于它可能会弄错名字或消息,我希望它首先读出消息和人名以进行确认,我做得很好。

问题是,要确认或取消,我也想使用语音识别。如果在读出消息后,用户说了类似发送的内容,然后它才应该继续发送消息。所以,我需要知道的是如何/是否可以在下面的代码中实现这个 (newVoiceCommand):

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
    case RESULT_SPEECH: {
        if (resultCode == RESULT_OK && null != data) {
            s="";
            text = data
                    .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
            decide = text.get(0).split("\\s");
            for (int i=1; i<decide.length;i++) s= s+decide[i] + " ";
            if (decide [0].equals("text")){
                if (!s.equals("")){
                    msg = s.split(" message");
                    char[] stringArray = msg[0].toCharArray();
                    stringArray[0] = Character.toUpperCase(stringArray[0]);
                    msg[0] = new String(stringArray);
                    contact = get_Number (test(msg[0]));
                    Intent intent = getIntent();
                    finish();
                    startActivity(intent);
                    String temp = "Are you sure you want to send " + msg[1] + " to " + test(msg[0]);
                    speakOut (temp);

                    if (newVoiceCommand.equals("send")){
                        try {
                            SmsManager smsManager = SmsManager.getDefault();
                            out.append(contact);
                            smsManager.sendTextMessage(contact, null, msg[1], null, null);
                            Toast.makeText(getApplicationContext(), "SMS Sent! to "+msg[0] + " at " +contact,
                                        Toast.LENGTH_LONG).show();
                          } catch (Exception e) {
                            Toast.makeText(getApplicationContext(),
                                "SMS faild, please try again later!",
                                Toast.LENGTH_LONG).show();
                            e.printStackTrace();
                          }
                    }
                    else if (newVoiceCommand.equals("no")) out.append("Not sending");
                }
            }
            else if (decide[0].equals("call")){
                out.append (s);
                if (!s.equals(""))  {
                    call (s);
                }
            }
        }
        break;
    }
    }
}

我目前的尝试:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
    case RESULT_SPEECH: {
        if (resultCode == RESULT_OK && null != data) {
            s="";
            //Grab the speech results and save them in an arraylist
            text = data
                    .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
            //Split each word into an array item
            decide = text.get(0).split("\\s");
            //Re-concatenate the words starting with the second word together
            for (int i=1; i<decide.length;i++) s= s+decide[i] + " ";
            //If the first word is "text", then send an SMS using the rest of the information spoken
            if (decide [0].equals("text")){
                if (!s.equals("")){
                    check (s);
                    Intent spIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
                    spIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "en_US");

                    try {
                        startActivityForResult(spIntent, RESULT_SPEECH2);
                    } catch (ActivityNotFoundException a) {
                        Toast t = Toast.makeText(getApplicationContext(),
                                "Opps! Your device doesn't support Speech to Text",
                                Toast.LENGTH_SHORT);
                        t.show();
                    }
                    switch (requestCode) {
                    case RESULT_SPEECH2: {
                        if (resultCode == RESULT_OK && null != data) {
                            text2 = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                            s2 = "";
                            if (text2.get(0).equals("send")){
                                smsText (s);
                            }
                            else if (text2.get(0).equals("cancel")) return;
                        }
                    }

最佳答案

简而言之,所有语音识别结果都将通过对 onActivityResult 的异步调用传给您。您不会阻塞并等待结果,因此您需要一种方法来确定识别是对命令的响应还是在您收到结果时的确认。

这是 what the requestCode parameter of Activity.startActivityForResult()用于:

Sometimes you want to get a result back from an activity when it ends. For example, you may start an activity that lets the user pick a person in a list of contacts; when it ends, it returns the person that was selected. To do this, you call the startActivityForResult(Intent, int) version with a second integer parameter identifying the call. The result will come back through your onActivityResult(int, int, Intent) method.

如果您在启动语音识别 Activity 时为 requestCode 使用两个不同的值(例如,定义 private final static int REQUEST_SPEECH_COMMAND = 1, REQUEST_SPEECH_CONFIRMATION = 2),您可以在 onActivityResult 中做出不同的响应。请注意,您需要存储第一次语音识别的结果(操作、消息和收件人),以便第二次可以使用此信息。

关于android - 从 Android 中的 onActivityResult 中提示语音识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16127568/

相关文章:

php - PHP 中的语音识别?

java - 如何以编程方式导入本地 JSON 文件?

java - Android开发-HttpClient异常

android - gradlew assemble 和 gradlew compile 有什么区别

Android - 语音识别一个词?

android - android中的语音识别是如何工作的?

android - 有没有办法找出启动 Activity 的 startActivity Intent 标志?

java - Android 加载全图 Recyclerview Cardview

android - 如何在 Android Things 应用程序上获得语音识别?

PHP 语音识别 API