Включение и выключение TextToSpeech с помощью переключателя? - PullRequest
0 голосов
/ 28 апреля 2020

Итак, у меня есть приложение, подключенное к firebase. Приложение извлекает данные (строку) из firebase в текстовое представление, а затем функция TextToSpeech считывает текст (не из textView, но сама получает те же данные из базы данных в реальном времени firebase). Я использовал метод onDataChange (), чтобы функция texttospeech считывала текст, как только в Firebase происходит какое-либо изменение данных, а не по нажатию какой-либо кнопки. Теперь я хочу поместить кнопку переключения в свое приложение и использовать ее, чтобы включить или выключить функцию tts, но я не могу заставить ее работать. Когда кнопка переключения выключена, я хочу, чтобы функция texttospeech остановилась, а когда состояние кнопки включено, я хочу, чтобы функция texttospeech снова включилась. Вот что я попробовал:

  mtts = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
        @Override
        public void onInit(int status) {
            if (status != TextToSpeech.ERROR){
                mtts.setLanguage(Locale.US);    }else{


                Toast.makeText(MainActivity.this, "Couldnt initialize speech function!", Toast.LENGTH_SHORT).show();
            }

        }
    }); mIvToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        if (isChecked){
                            reff = FirebaseDatabase.getInstance().getReference().child("Match").child("Screen1");
                            reff.addValueEventListener(new ValueEventListener() {
                                @Override
                                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {


                                    String tts= dataSnapshot.getValue().toString();
                                    mtts.speak(tts, TextToSpeech.QUEUE_FLUSH, null);


                                }

                                @Override
                                public void onCancelled(@NonNull DatabaseError databaseError) {

                                }
                            });


                        }else{
                            mtts.stop();
                            mtts.shutdown();



                        }
                    }
                });

TIA!

1 Ответ

0 голосов
/ 28 апреля 2020

Когда вы присоединяете valueEventListener, слушатель будет срабатывать до тех пор, пока в данных происходят изменения, даже если вы выключили toggle. Итак, что вы должны сделать, это удалить слушателя, когда вы закончите:

Прямо под этим:

  mtts = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
        @Override
        public void onInit(int status) {
            if (status != TextToSpeech.ERROR){
                mtts.setLanguage(Locale.US); 

            }else{
Toast.makeText(MainActivity.this, "Couldnt initialize speech function!", Toast.LENGTH_SHORT).show();
            }

        }
    });

Добавьте эти :

    //the reference

reff=FirebaseDatabase.getInstance().getReference().child("Match").child("Screen1");


    //make a listener

    ValueEventListener listener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {

     String tts= dataSnapshot.getValue().toString();
     mtts.speak(tts, TextToSpeech.QUEUE_FLUSH, null);

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

        Log.w(TAG, "loadPost:onCancelled", databaseError.toException());

    }
};





//toggle

mIvToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
//add listener
reff.addValueEventListener(listener);


}else{
//remove listener
reff.removeEventListener(listener);

mtts.stop();
mtts.shutdown();



}
}
});
...