2013-08-08 4 views
9

私は基本的に同じコードを使って発言していましたが、そのコードを別のアクティビティに移動しなければなりませんでした。私が知ることができる唯一の違いは、音声対話は非同期メソッドで呼び出されないということです。スピーチはspeakFullメソッドで行われます。 私はこれらのエラーを取得:話が失敗してもTTSエンジンにバインドされていない

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

私はアンドロイドの開発に新たなんだ、私は、この問題に対する他のソリューションを通じて検索した、と私は本当に私の仕事を作るための解決策を見つけるように見えることはできません。助言や助けをいただければ幸いです。

コード:

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 

    } 

} 

答えて

12

あなただけ(のOnInit後speak()を呼び出すことができますが)と呼ばれていました。だから、)あなたのTTSは、(のOnInitにのonCreateのコードを話す

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

} 

を移動し、この作品の真boolean paused = true;

+0

に一時停止を初期化し、私は今ものの1つの質問があります。 2つ目のアクティビティとすべてのUIを表示するように切り替えることがあります。また、それが黒い画面になって読み始めることもあります。アンドロイドは、プログラムが応答していないことを常に伝えます。なぜあなたは知っていますか? –

+0

私はあなたの質問を理解していないので、あなたのコメントの文法やスペルを言い換えることができます。 –

+0

私のために働いた。ありがとう! –

関連する問題