2011-01-25 4 views
4

Я действительно борюсь с чем-то ... У меня есть пара предложений, которые я хочу прочитать, как в устной форме через функцию tts speek, так и через текст на экране, один предложение за раз.Android: до тех пор, пока говорить tts не закончится, а затем продолжить

У меня есть область текстового поля готова, но сложение ее - это то, что я не получаю. Либо он прочитает все предложения и покажет только последний, либо покажет и прочитает только первое предложение.

Кто-нибудь знает, как я могу достичь этой цели?

ответ

-1
boolean speakingEnd = tts.isSpeaking(); 
do{ 
    speakingEnd = tts.isSpeaking(); 
} while (speakingEnd); 
//Continue with code 
1
public void speak(String message){   
    tts.speak(message, TextToSpeech.QUEUE_FLUSH, null); 
    while (tts.isSpeaking()){ 
     System.Out.Println("Do something or nothing while speaking..") 
    } 
} 
3

Я просто столкнулся с этим вопросом, в соответствии с speak method, используйте UtteranceProgressListener. Я узнал, что это не выполняется в потоке пользовательского интерфейса, поэтому мне пришлось использовать runOnUiThread(), чтобы вернуться к обновлению активности.

tts.setOnUtteranceProgressListener(new UtteranceProgressListener() { 
     @Override 
     public void onStart(String utteranceId) { 

     } 

     @Override 
     public void onDone(String utteranceId) { 
      LettersActivity.this.runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        // Do something on UI thread 
       } 
      }); 
     } 

     @Override 
     public void onError(String utteranceId) { 
      Log.e(TAG, "error on " + utteranceId); 
     } 
    }); 
+0

Спасибо, но только работает ИЗА> = 15 – mesutpiskin

0

Попробуйте

public class MainActivity extends AppCompatActivity implements TextToSpeech.OnInitListener{ 


    private boolean initialized; 
    private String queuedText; 
    private String TAG = "TTS"; 
    private TextToSpeech tts; 




    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 



     tts = new TextToSpeech(this /* context */, this /* listener */); 
     tts.setOnUtteranceProgressListener(mProgressListener); 


     speak("hello world"); 

    } 




    public void speak(String text) { 

     if (!initialized) { 
      queuedText = text; 
      return; 
     } 
     queuedText = null; 

     setTtsListener(); // no longer creates a new UtteranceProgressListener each time 
     HashMap<String, String> map = new HashMap<String, String>(); 
     map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "MessageId"); 
     tts.speak(text, TextToSpeech.QUEUE_ADD, map); 
    } 


    private void setTtsListener() { 

    } 





    @Override 
    public void onInit(int status) { 
     if (status == TextToSpeech.SUCCESS) { 
      initialized = true; 
      tts.setLanguage(Locale.ENGLISH); 

      if (queuedText != null) { 
       speak(queuedText); 
      } 
     } 
    } 



    private abstract class runnable implements Runnable { 
    } 




    private UtteranceProgressListener mProgressListener = new UtteranceProgressListener() { 
     @Override 
     public void onStart(String utteranceId) { 
     } // Do nothing 

     @Override 
     public void onError(String utteranceId) { 
     } // Do nothing. 

     @Override 
     public void onDone(String utteranceId) { 

      new Thread() 
      { 
       public void run() 
       { 
        MainActivity.this.runOnUiThread(new runnable() 
        { 
         public void run() 
         { 

          Toast.makeText(getBaseContext(), "TTS Completed", Toast.LENGTH_SHORT).show(); 

         } 
        }); 
       } 
      }.start(); 

     } 
    }; 


}