2012-06-16 2 views
3

В моем приложении для Android я использую движок Text to Speech, чтобы на нем был фрагмент текста. Речевой код запускается, когда телефон звонит. Речь сломана, и я вижу следующие предупреждения в логарифме. Обратите внимание, что эта проблема видна на SDK 15 (сэндвич с мороженым), особенно когда код вызова вызывается, когда телефон звонит, иначе даже на ICE речевой код отлично работает при вызове в любое другое время, когда телефон не звонит. код прекрасно работает на SDK 8 и 10.Android Text to Speech сломан во время телефонного звонка

The предупреждения я получаю являются:

com.svox.pico W/AudioTrack(549): obtainBuffer() track 0x177dd8 disabled, restarting 
com.svox.pico W/AudioTrack(549): obtainBuffer() track 0x177dd8 disabled, restarting 
com.svox.pico D/dalvikvm(549): GC_CONCURRENT freed 441K, 8% free 6552K/7111K, paused 3ms+107ms 
com.svox.pico W/AudioTrack(549): obtainBuffer() track 0x156058 disabled, restarting 
com.svox.pico D/dalvikvm(162): GC_CONCURRENT freed 532K, 11% free 8391K/9415K, paused 5ms+6ms 

Соответствующий фрагмент кода работает в потоке в службе, и служба запущена в радиовещательного приемника, когда его получает телефонный звонок.

// The constructor of speaker class 
public Speaker(final Context context, final Settings settings) 
{ 
    this.settings = settings; 
    params = new HashMap<String, String>();  
    params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_ALARM)); 
    params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "myapp"); 

    this.context = context;  

    synchronized (synch) 
    { 
     talker = new TextToSpeech(context, this); 
    } 

    Utils.log(TAG, "Created TextToSpeech.."); 
} 

@Override 
public void onInit(final int status) 
{ 
    synchronized (synch) 
    { 
     Utils.log(TAG, "TTS onInit.."); 

     if(talker == null) 
     { 
      throw new RuntimeException(Utils.collectPlatformInfo(context)); 
     } 

     if(TextToSpeech.ERROR == talker.setOnUtteranceCompletedListener(new SpeechFinishedListener())) 
     { 
      Utils.log(TAG, "Error tts setUt"); 
      return ; 
     } 

     int code = talker.setLanguage(Locale.getDefault()); 

     if(code == TextToSpeech.LANG_NOT_SUPPORTED || code ==TextToSpeech.LANG_MISSING_DATA) 
     { 
      Utils.log(TAG, String.format("Error settingLang on TTS code %d", code));    
     } 

     if(TextToSpeech.ERROR == talker.setSpeechRate(settings.getSpeed())) 
     { 
      //this error is not a fatal, we can continue 
      Utils.log(TAG, "Error tts setSPeechrate");      
     } 

     if(TextToSpeech.ERROR == talker.setPitch(settings.getPitch())) 
     { 
      //this error is not a fatal, we can continue 
      Utils.log(TAG, "Error tts setPitch");   
     } 

     ready = true; 
    } 
} 

    // The function used to provide text to be spoken.. 
public void speak(final String text) throws InterruptedException 
{ 
    if(bEngineFailure) 
     return; 

    if(!ready) 
    { 
     Utils.log(TAG, "engine not initialized"); 
     bEngineFailure = true; 
     return; 
    } 

    bSpeechComplete = false; 

    talker.speak(text, TextToSpeech.QUEUE_ADD, params); 

    while(!bSpeechComplete) 
    { 
      Thread.sleep(100);   
    } 

} 
+0

Трудно догадаться, пожалуйста, разместите соответствующий образец кода. – Sam

+0

@Sam Я обновил сообщение и добавил соответствующий код. – Ahmed

ответ

2

Это только предположение, потому что не так много, чтобы идти дальше здесь, но я видел подобную ситуацию, если объем телефон находится на кольце (не вибрирует) туда, где мелодия будет играть, когда поступает вызов и воспроизводится какой-то другой звук (т. е. TTS/музыка/видео), один из аудиопотоков становится все прерывистым/сломанным, потому что он пытается играть одновременно. Если это ваш желаемый эффект, чтобы играть и в то же время, то одна работа вокруг вы могли бы сделать, это продлить PhoneStateListener и паузы аудио так часто, то играть пример TTS

продления PhoneStateListener можно найти here

+0

Попытка воспроизведения речи во время телефонного звонка работала до пряников и более ранних версий. Я пробовал тихую мелодию звонка, но безрезультатно. Тем не менее, у меня есть некоторые приложения, играющие речевую речь и мелодию в одно и то же время в ICS без проблем. – Ahmed

+0

Знаете ли вы, какие приложения были у них? – tyczj

Смежные вопросы