2013-04-21 3 views
3

Надеюсь, я буду достаточно ясным.Быстрое распознавание голоса изнутри onActivityResult в Android

В моем приложении я установил его так, чтобы нажатие кнопки «Назад» активировало службу распознавания голоса Google. В onActivityResult он проверяет, является ли первое слово «вызовом» или «текстом», и действуйте соответственно с остальной частью произнесенного предложения. Для текста в частности это похоже на «текст [контактное имя] сообщение [содержимое сообщения]», а затем отправляет его с помощью 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; 
         } 
        } 

ответ

2

Короче говоря, все результаты распознавания голоса собираются прийти к вам через асинхронный звонок до onActivityResult. Вы не блокируете и не ждете результата, поэтому вам нужно определить, соответствует ли распознавание команде или подтверждению на момент получения результата.

Это what the requestCode parameter of Activity.startActivityForResult() для:

Иногда вы хотите получить результат обратно от деятельности, когда она заканчивается. Например, вы можете начать задание, которое позволяет пользователю выбрать человек в списке контактов; когда он заканчивается, он возвращает человека, которого выбрали . Для этого вы вызываете версию startActivityForResult(Intent, int) со вторым целочисленным параметром, идентифицирующим вызов. Результат вернется через ваш метод onActivityResult(int, int, Intent) .

Если вы используете два разных значения для requestCode (например, определить private final static int REQUEST_SPEECH_COMMAND = 1, REQUEST_SPEECH_CONFIRMATION = 2) при запуске активности распознавания голоса, вы можете реагировать по-разному в onActivityResult. Обратите внимание, что вам нужно сохранить результаты первого распознавания голоса (действие, сообщение и получателя), чтобы эта информация была доступна во второй раз.

+0

Мне нужно, чтобы активность распознавания голоса начиналась автоматически после того, как сообщение считывается, то есть после вызова метода talkOut (s). Но это означает, что я должен начать работу изнутри для первого речевого результата, который я не могу сделать – iMimi

+0

@ user2303527 Это именно то, что вам нужно сделать - вызвать 'startActivityForResult()' для запуска нового распознавателя речи из 'onActivityResult '. Почему ты не можешь это сделать? – user113215

+0

Потому что, когда я это сделал, он разбился. Я обновил сообщение с моей попыткой реализовать ваше предложение – iMimi