繁体   English   中英

为什么不调用UtteranceProgressListener的函数?

[英]Why are the functions of UtteranceProgressListener not called?

当我打电话speak它的类的功能, UtteranceProgressListener被调用,但听者的方法不叫即onStart()onDone()onError()

最终,我们希望编写一段代码,可以使用播放暂停按钮将文本暂停为语音并从同一句子恢复。

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;
    }
}

setOnUtteranceProgressListener()方法必须之前调用speak()被调用。 现在,您首先调用您的speakOut()方法,然后才设置监听器。 反之亦然,例如:

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();
        }
    }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM