2011-10-10 5 views
0

우리는 VoiceRecognition에 의해 제어되어야하는 간단한 퀴즈를 구현하려고합니다. 우리는 하나의 QuestionActivity와 하나의 AnswerActivity를 가져야합니다. QuestionActivity에서는 TextToSpeech가 질문을 읽은 후 사용자가 VoiceRecognition 활동에 응답 할 수 있습니다. 그런 다음 AnswerActivity는 startActivityForResult (...)에 의해 시작되며 VoiceRecognition을 사용하여 사용자가 다음 질문으로 다시 이동할 수 있습니다. 그러나 사용자가 두 번째 질문으로 돌아 가면 알 수없는 오류로 인해 VoiceRecognizer가 작동하지 않습니다. 난 항상를 다시 시작해야Android VoiceRecognition onActivityResult

public class QuestionActivity extends Activity implements OnClickListener, OnInitListener, OnUtteranceCompletedListener { 

private static final int VOICE_RECOGNITION_REQUEST_CODE = 1234; 

private TxtToSpeech toSpeech = null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    toSpeech = new TxtToSpeech(this); 
    setContentView(R.layout.main); 

    // Get display items for later interaction 
    Button speakButton = (Button) findViewById(R.id.btn_speak); 

    // Check to see if a recognition activity is present 
    PackageManager pm = getPackageManager(); 
    List<ResolveInfo> activities = pm.queryIntentActivities(
      new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0); 
    if (activities.size() != 0) { 
     speakButton.setOnClickListener(this); 
    } else { 
     speakButton.setEnabled(false); 
     speakButton.setText("Recognizer not present"); 
    } 
} 

public void onClick(View v) { 
    if (v.getId() == R.id.btn_speak) { 
     startVoiceRecognitionActivity(); 
    } 
} 

private void startVoiceRecognitionActivity() { 
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
      RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
    intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Speech recognition demo"); 
    intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 
    startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) { 
     //---Code to restart 
     //Without this code the recognizer wont work! 
     Intent i = getIntent(); 
     finish(); 
     startActivity(i); 
     //----------------- 

     Intent intent = new Intent(this, SubActivity.class); 
     startActivityForResult(intent , 2222); 
    } 
    else if(requestCode == 2222) 
    { 
     saySomething(); 
    } 

    super.onActivityResult(requestCode, resultCode, data); 
} 

void saySomething() 
{ 
    toSpeech.playVoice(new String[] {"My Question"}, true); //true == start Recognition afterwards 
} 
@Override 
public void onInit(int status) { 
    toSpeech.mTts.setLanguage(Locale.US); 
    toSpeech.mTts.setOnUtteranceCompletedListener(this); 
    saySomething(); 
} 

@Override 
public void onUtteranceCompleted(String utteranceId) { 
    startVoiceRecognitionActivity(); 
} 

공용 클래스 AnswerActivity이 활동 OnInitListener, OnUtteranceCompletedListener {

public final static int VOICE_RECOGNITION_REQUEST_CODE = 4321; 
private TxtToSpeech toSpeech = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    toSpeech = new TxtToSpeech(this); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     setResult(RESULT_OK); 
     finish(); 

    super.onActivityResult(requestCode, resultCode, data); 
} 

@Override 
public void onUtteranceCompleted(String utteranceId) { 
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
      RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
    intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Speech recognition demo"); 
    startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE); 
} 

@Override 
public void onInit(int status) { 
    toSpeech.mTts.setOnUtteranceCompletedListener(this); 
    toSpeech.mTts.setLanguage(Locale.US); 
    toSpeech.playVoice(new String[] {"correct answer"}, true); //again start recognition after voice 
} 

}

public class TxtToSpeech { 
    public TextToSpeech  mTts   = null; 
    public Context  ctxt   = null; 
    public boolean  recordAnswer = false; 

    public TxtToSpeech(Context context){ 

     mTts = new TextToSpeech(context, (OnInitListener)context); 
     ctxt = context; 
    }  
    public void playVoice(String[] sentences, boolean answer){ 
     final HashMap<String, String> utteranceMap = new HashMap<String,String>(); 
     utteranceMap.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "1"); 

     recordAnswer = answer; 

     StringBuilder builder = new StringBuilder(); 
     for(String s:sentences) 
     { 
      builder.append(s); 
      builder.append(","); 
     } 
     final String text = builder.toString(); 

     if(recordAnswer) 
      mTts.speak(text, TextToSpeech.QUEUE_ADD, utteranceMap); 
     else 
      mTts.speak(text, TextToSpeech.QUEUE_ADD, null); 
    } 

}

할를 구현 확장 : 아래의 샘플 코드를 참조하십시오 실행중인 VoiceRecognition을 사용하려면 전체 QuestionActivity가 필요합니까? 게임 도중 사용자는 Question-와 AnswerActivity 사이를 순환하는 것만으로 활동을 마무리하는 것보다 더 좋은 방법이 있습니까?

답변

0

오류에 대해 설명해주십시오.

일반적으로 활동을 다시 시작하는 것은 사용자가 항상 전환 한 이후 Android 활동의 정상적인 부분이어야합니다. 또한 두 가지 활동이 어색한 경우 어쩌면 단 하나의 활동만으로도 얻을 수 있습니다.

관련 문제