0

VoiceRecognitionで制御する必要のある簡単なクイズを実装しようとしています。1つのQuestionActivityと1つのAnswerActivityをアクティビティする必要があります。QuestionActivityでは、質問がTextToSpeechによって読み取られ、その後、ユーザーはVoiceRecognitionアクティビティに回答できます。次に、AnswerActivityはstartActivityForResult(...)によって開始されます。これは、VoiceRecognitionを使用して、ユーザーが次の質問に戻ることができるようにします。ただし、ユーザーが2番目の質問に戻った場合、不明なエラーのためにVoiceRecognizerは機能しません。以下のサンプルコードを参照してください。

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はActivityを拡張し、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の間を循環するだけで、アクティビティを単にfinish()-するよりも良い方法がありますか?

4

1 に答える 1

0

表示されるエラーについて説明してください。

一般に、ユーザーは常に切り替えるため、アクティビティの再起動は Android アクティビティの通常の部分である必要があります。また、2 つの活動がぎこちない場合は、1 つの活動だけで済むかもしれません。

于 2011-10-11T17:59:28.833 に答える