마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

TTS 관련 질문입니다.

0 추천

낱말에 맞는 그림을 선택하는 게임인데  정답을 맞춘후 다음 문제로 넘어갈때 중복으로 tts가 실행 됩니다.

예를 들어 위의 text view가 사과 일때 사과 그림을 눌러 정답을 맞추면 정답이라는 tts가 실행되고 다음 문제로 넘어가면서 해당 위치그림의 tts가 실행됩니다. 액티비티를 넘어갈때 자동으로 tts가 실행되는데 어떻게 해야하나요. 다시 말하자면 정답을 맞춘후 다음 문제로 넘어갈때 자동으로 tts가 실행된다는 것입니다.

 

tts = new TextToSpeech(fruit.this, new TextToSpeech.OnInitListener() {
    @Override
    public void onInit(int status) {
        if (status == TextToSpeech.SUCCESS) {
            int result = tts.setLanguage(Locale.KOREAN);

            if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                Toast.makeText(fruit.this, "지원하지 않는 언어", Toast.LENGTH_SHORT).show();

            }
        }
    }
});

       tts는 이렇게 구성했고 클릭을 받는 view는 아래 처럼 구성이 되어있습니다.

view1.setOnClickListener(new View.OnClickListener() { //View1 눌렀을 때 textview의 값에 따라서
    @Override
    public void onClick(View v) {

        if(rr==0){

            updateQuestion(r.nextInt(mQuestionLength));
            mScore++;
        }
        if(rr==1){
            tts.speak("레몬",TextToSpeech.QUEUE_FLUSH,null,null);
            mFalse++;
            Toast.makeText(getApplicationContext(),
                    "틀렸습니다.", Toast.LENGTH_SHORT).show();
        }
        if(rr==2){
            tts.speak("사과",TextToSpeech.QUEUE_FLUSH,null,null);
            mFalse++;
            Toast.makeText(getApplicationContext(),
                    "틀렸습니다.", Toast.LENGTH_SHORT).show();
        }

view는 총 4개가 있고 rr의 값에 따라서 각각의 view의 경우에 맞는 코드가 실행됩니다.

view코드 밑에 tts관련 onDestroy를 넣어놨습니다.

@Override
public void onDestroy() {
    if (tts != null) {
        tts.stop();
        tts.shutdown();
    }
    super.onDestroy();
}
몰라요아무것도 (120 포인트) 님이 2020년 10월 21일 질문
몰라요아무것도님이 2020년 10월 21일 수정
코드를 직접 실행해 보기 전에는 정확하게 알 수 없지만,   혹시나 해서 그러는데 tts 멈추는 코드를 onStop이나 onPause로 옮겨 보세요. 그리고 tts 생성하는 부분을 onStart나 onResume에 두시구요.
그리고
if(rr==1){
            ....
          return;
             
        }

Early return 도 하시구요.
감사해요 ㅠㅠㅠㅠ return; 쓰니까 잘 작동해요ㅜㅠㅠ

1개의 답변

0 추천

되신다니 잘 되었네요. 추가로 코드를 좀 더 읽기 쉽고 수정에 유연하도록 수정하시기를 권장합니다. 간단한 코드 샘플을 첨부합니다. 

public abstract class Answer {
    private final String text;

    public Answer(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }
}

class CorrectAnswer extends Answer {

    public CorrectAnswer(String text) {
        super(text);
    }
}

class Distractor extends Answer {

    public Distractor(String text) {
        super(text);
    }
}


public class TtsQuestion {
    private final List<Answer> answers;
    private final QuestionCallback callback;

    public TtsQuestion(List<Answer> answers, QuestionCallback callback) {
        this.answers = answers;
        this.callback = callback;
    }

    public void selectAnswer(int choice) {
        final Answer chosenAnswer = answers.get(choice);
        if (chosenAnswer == null) throw new IllegalArgumentException("Cannot find relevant answer");

        if (chosenAnswer instanceof CorrectAnswer) {
            callback.onSelectCorrectAnswer();
            return;
        }

        callback.onSelectDistractor((Distractor) chosenAnswer);
    }
}

interface QuestionCallback {
    void onSelectCorrectAnswer();
    void onSelectDistractor(Distractor distractor);
}

final TtsQuestion question = new TtsQuestion(Arrays.asList(
            new CorrectAnswer("Banana"),
            new Distractor("Lemon"),
            new Distractor("Apple"),
            new Distractor("Grape")
        ), new QuestionCallback() {
            @Override
            public void onSelectCorrectAnswer() {
                System.out.println("Update question");
            }

            @Override
            public void onSelectDistractor(Distractor distractor) {
                System.out.println("Oh No, Selected wrong answer!!!");
            }
        });

        question.selectAnswer(0);

        //question.selectAnswer(1);
        //question.selectAnswer(2);
    }

 

또는 Strategy 패턴도 적합할 것 같아요.

interface AnswerSelectionStrategy {
    void execute(Answer selected);
}

class ShowNextQuestion implements AnswerSelectionStrategy {

    @Override
    public void execute(Answer selected) {

    }
}

class DisplayError implements AnswerSelectionStrategy {

    @Override
    public void execute(Answer selected) {

    }
}

public abstract class Answer {
    private final String text;
    private final AnswerSelectionStrategy strategy;

    public Answer(String text, AnswerSelectionStrategy strategy) {
        this.text = text;
        this.strategy = strategy;
    }

    public String getText() {
        return text;
    }

    public AnswerSelectionStrategy getStrategy() {
        return strategy;
    }
}

public class TtsQuestion {
    private final List<Answer> answers;

    public TtsQuestion(List<Answer> answers) {
        this.answers = answers;
    }

    public void selectAnswer(int choice) {
        final Answer chosenAnswer = answers.get(choice);
        if (chosenAnswer == null) throw new IllegalArgumentException("Cannot find relevant answer");

        chosenAnswer.getStrategy().execute(chosenAnswer);

    }
}

 

spark (226,720 포인트) 님이 2020년 10월 25일 답변
spark님이 2020년 10월 25일 수정
...