0

我正在尝试使用此方法在我的主要活动中开始另一个活动:

 public void switchToRead(){// Switches to the reading view which displays the text that the tts engine reads off.
    Intent intent = new Intent(getApplicationContext(),ReadOut.class);
    intent.putExtra("response", res);
    startActivity(intent);
}

这将启动以下课程:

package com.example.webview;

import android.os.Bundle;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.speech.tts.TextToSpeech;
import android.text.method.ScrollingMovementMethod;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class ReadOut extends Activity implements TextToSpeech.OnInitListener, OnClickListener {


    boolean paused = false;
    String leftToRead = null;
    String res = null;
    TextToSpeech tts;

    protected void onPreExecute()
    {  
        System.out.println("Pre-execute");

    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.read_out);
        Intent intent = getIntent();
        res = intent.getExtras().getString("response");
        TextView textv = (TextView) findViewById(R.id.textView1);
        textv.setText(res);
        textv.setMovementMethod(new ScrollingMovementMethod());
        android.view.Display display = ((android.view.WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
        textv.setHeight((int)(display.getHeight()*0.76));
        System.out.println("START");
        tts = new TextToSpeech(this, this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        return true;
    }

    public String speakFull(String text){
        System.out.println("Speaking: " + text);
        System.out.println("Speaking");
        String[] sentences = text.split("\n|\\.(?!\\d)|(?<!\\d)\\."); // Regex that splits the body of text into the sentences of that body which are stored in a String array.
        for(int i = 0; i < sentences.length; i++){
            if(!tts.isSpeaking() && !paused){
                System.out.println("Speaking: " + i);
                tts.speak(sentences[i], TextToSpeech.QUEUE_FLUSH, null);
            }else if(paused){
                System.out.println("Paused");
                String paused = "";
                int k = 0;
                if(i != 0){
                    k = i-1;
                }
                leftToRead = null;
                for(int j = k; j < sentences.length; j++){
                    leftToRead += sentences[j];
                }
                return leftToRead;
            }else{
                i--;
                System.out.println("Sleeping");
                System.out.println("Speaking : " + tts.isSpeaking());
                try {
                    Thread.sleep(1000);
                } catch(InterruptedException ex) {
                    Thread.currentThread().interrupt();
                }
            }
            if(i == sentences.length - 1){
                return "Message 001: Complete";
            }
        }
        return null;
    }

    @Override
    public void onInit(int arg0) {
            System.out.println("speakFull");
            leftToRead = speakFull(res);

    }

    public void clickPause(View v){
        if(paused){
            paused = false;
            Button b = (Button) findViewById(R.id.button1);
            b.setText("Play");
        }else{
            paused = true;
            Button b = (Button) findViewById(R.id.button1);
            b.setText("Pause");
            if(leftToRead == null){
                leftToRead = speakFull(res);
            }else{
                leftToRead = speakFull(leftToRead);
            }
        }
    }

    @Override
    public void onClick(DialogInterface arg0, int arg1) {
        // TODO Auto-generated method stub

    }

}

在 ReadOut 类启动后,可能会发生几件事之一,屏幕变黑,文本到语音开始阅读,应用程序告诉我它没有响应,或者它向我显示 ReadOut 的视图,读取文本到语音,然后告诉我它没有响应。我真的很困惑为什么会这样,任何见解都将不胜感激。

4

1 回答 1

2

我对使用 TTS 一无所知,但我可以告诉你,这条线可能会导致问题

 Thread.sleep(1000);

看来您正在调用它,UI Thread这不是一个好主意。您需要使用背景并使用类似或的内容Thread更新它,或者您可以使用.runOnUiThread()AsyncTaskHandler

于 2013-08-13T16:33:29.123 回答