2011-10-10 48 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); 
    } 

}

做我总是要重新启动整个QuestionActivity为了有一个正在运行的VoiceRecognition?在游戏过程中,用户只能在问题和AnswerActivity之间循环,而不仅仅是完成()活动?

回答

0

请说明你得到的错误。

一般来说,重新开始一个活动应该是任何Android活动的正常组成部分,因为用户总是在切换。另外,如果两项活动很尴尬,也许你可以只用一个。