2 votes

Pourquoi les fonctions de UtteranceProgressListener ne sont-elles pas appelées ?

Quand j'appelle le speak de sa classe, le UtteranceProgressListener est appelé mais les méthodes de l'écouteur ne sont pas appelées, c'est-à-dire que la fonction onStart() ,le onDone() y onError() .

En fin de compte, nous voulons écrire un morceau de code qui puisse mettre en pause la synthèse vocale et reprendre à partir de la même phrase à l'aide des boutons lecture-pause.

package com.example.android.m_tour;

import android.content.Intent;
import android.speech.tts.TextToSpeech;
import android.speech.tts.UtteranceProgressListener;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.wnafee.vector.MorphButton;

import java.util.HashMap;
import java.util.Locale;

import static com.example.android.m_tour.R.id.mb;

public class guide extends AppCompatActivity implements MorphButton.OnStateChangedListener {

    private Button settingsButton;
    private String data, s;
    private TextView textView;
    private static TextToSpeech textToSpeech;

    //qr code scanner object
    private MainActivity mainActivity;
    private TTSsettings ttSsettings;
    private MorphButton control;
    private Locale loc;
    private String pr[];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_guide);
        control = (MorphButton) findViewById(mb);
        mainActivity = new MainActivity();
        textView = (TextView) findViewById(R.id.textview);
        textView.setText(mainActivity.getData());
        settingsButton = (Button) findViewById(R.id.settings);
        ttSsettings = new TTSsettings();
        loc = new Locale("en_IN");

        control.setOnStateChangedListener(this);
        settingsButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent = new Intent(guide.this, TTSsettings.class);
                startActivity(intent);
                /*textToSpeech.stop();
                Intent intent = new Intent();
                intent.setAction("com.android.settings");
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);*/
            }
        });
        data = mainActivity.getData();
        onStart();

        textToSpeech = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int i) {
                if (i == TextToSpeech.SUCCESS) {
                    //set language Locale to US
                    int result = textToSpeech.setLanguage(loc);
                    //check that is language locale available on device or supported
                    if (result == TextToSpeech.LANG_MISSING_DATA
                            || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                        Toast.makeText(guide.this, "Leanguage not present", Toast.LENGTH_SHORT).show();
                    } else {
                        speakOut();
                    }

                } else {
                    //show toast if initialization failed
                    Toast.makeText(getBaseContext(), "TTS Engine Initilization Failed!", Toast.LENGTH_SHORT).show();
                }

                textToSpeech.setOnUtteranceProgressListener(new UtteranceProgressListener() {
                    @Override
                    public void onStart(String s) {
                        //if ("id".equals(s)
                        Toast.makeText(guide.this, "onStart works", Toast.LENGTH_SHORT).show();

                    }

                    @Override
                    public void onDone(String s) {
                        //if ("id".equals(s))
                            Toast.makeText(guide.this, "onDone works", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onError(String s) {
                        //if ("id".equals(s))
                            Toast.makeText(guide.this, "OnError works", Toast.LENGTH_SHORT).show();
                    }
                });

            }
        });
    }

    @Override
    public void onDestroy() {
        // Don't forget to stop and shutdown text to speech engine!
        if (textToSpeech != null) {
            textToSpeech.stop();
            textToSpeech.shutdown();
        }
        super.onDestroy();
    }

    @Override
    public void onStateChanged(MorphButton.MorphState changedTo, boolean isAnimating) {
        if (changedTo == MorphButton.MorphState.END) {
            textToSpeech.stop();
        } else {
            speakOut();

        }
    }

    private void speakOut() {
        HashMap<String, String> params = new HashMap<String, String>();
        params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "id");
        textToSpeech.setPitch((float) ttSsettings.getPitchRate());
        textToSpeech.setSpeechRate((float) ttSsettings.getSpeechRate());
        textToSpeech.speak(pr[1], TextToSpeech.QUEUE_FLUSH, params);
        }

    //getters
    public String getData() {
        return data;
    }

    public static TextToSpeech getTextToSpeech() {
        return textToSpeech;
    }
}

3voto

Markus Kauppinen Points 2048

El setOnUtteranceProgressListener() doit être appelée avant la méthode speak() est appelé. Maintenant, vous appelez votre speakOut() d'abord, et seulement ensuite de définir l'écouteur. Il faut que ce soit l'inverse, comme dans :

textToSpeech = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
    @Override
    public void onInit(int i) {
        if (i == TextToSpeech.SUCCESS) {
            //set language Locale to US
            int result = textToSpeech.setLanguage(loc);
            //check that is language locale available on device or supported
            if (result == TextToSpeech.LANG_MISSING_DATA
                    || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                Toast.makeText(guide.this, "Leanguage not present", Toast.LENGTH_SHORT).show();
            } else {
                textToSpeech.setOnUtteranceProgressListener(
                    new UtteranceProgressListener() {
                    @Override
                    public void onStart(String s) {
                        //if ("id".equals(s)
                        Toast.makeText(guide.this, "onStart works", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onDone(String s) {
                        //if ("id".equals(s))
                        Toast.makeText(guide.this, "onDone works", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onError(String s) {
                        //if ("id".equals(s))
                        Toast.makeText(guide.this, "OnError works", Toast.LENGTH_SHORT).show();
                    }
                });                            

                speakOut();
            }
        } else {
            //show toast if initialization failed
            Toast.makeText(getBaseContext(), "TTS Engine Initilization Failed!", Toast.LENGTH_SHORT).show();
        }
    }
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X