2013-08-08 10 views
9

So hatte ich eine ursprüngliche Aktivität mit im Grunde die gleichen genauen Code zum Sprechen, aber ich musste diesen Code in eine andere Aktivität zu bewegen. Der einzige Unterschied, den ich feststellen kann, ist, dass der Text zu Sprache nicht in einer asynchronen Methode aufgerufen wird. Das Sprechen erfolgt in der speakFull-Methode. ich diese Fehler:Speak Failed Nicht an TTS-Engine gebunden

speak failed: not bound to TTS engine 
isSpeaking failed: not bound to TTS engine 

ich android Entwicklung neu bin ich durch andere Lösungen für dieses Problem gesucht haben, und ich kann nicht wirklich scheinen, eine Lösung zu machen Mine Arbeit zu finden. Jeder Rat oder jede Hilfe wird geschätzt.

Code:

package com.example.webview; 

import android.os.Bundle; 
import android.app.Activity; 
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; 

    @SuppressWarnings("deprecation") 
    @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)); 
     leftToRead = speakFull(res); 
    } 

    @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); 
     TextToSpeech tts = new TextToSpeech(this, this); 
     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 = ""; 
       for(int j = i - 1; j < sentences.length; j++){ 
        paused += sentences[j]; 
       } 
       return paused; 
      }else{ 
       i--; 
      } 
      if(i == sentences.length - 1){ 
       return "Message 001: Complete"; 
      } 
     } 
     return null; 
    } 

    @Override 
    public void onInit(int arg0) { 
     // TODO Auto-generated method stub 

    } 

    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 

    } 

} 

Antwort

12

Sie nur speak() nach onInit nennen kann() aufgerufen wurde. Also Ihr tts bewegen sprechen Code in onCreate zu onInit()

@Override 
public void onInit(int status) { 
    if (status == TextToSpeech.SUCCESS) { 
     leftToRead = speakFull(res); 

} 

und initialisieren Pause auf true boolean paused = true;

+0

Dies funktioniert, habe ich eine Frage, obwohl jetzt. Es wird manchmal wechseln, um die zweite Aktivität anzuzeigen, und die ganze Benutzeroberfläche und manchmal wird es zu einem schwarzen Bildschirm gehen und zu lesen beginnen, und Android wird Ihnen ständig sagen, dass das Programm nicht reagiert. Würdest du zufällig wissen warum? –

+0

Können Sie die Grammatik und Rechtschreibung in Ihrem Kommentar umformulieren und korrigieren, weil ich Ihre Frage nicht verstehe. –

+0

Arbeitete auch für mich. Vielen Dank! –

Verwandte Themen