2013-07-26 5 views
4

Я делаю вызывающее устройство, говорящее на имени вызывающего абонента, используя TTS. Я хочу приостановить рингтон, когда TTS говорит, а затем возобновляет мелодию звонка. Из того, что я исследовал, мы можем использовать AudioFocus (надеюсь, что так). Во всяком случае я использую следующий кодПрикоснитесь к мелодию телефона во время разговора через текст в речь, а затем возобновите работу

Update

Я использую этот код в настоящее время.

public void speak(final String talk) throws InterruptedException { 
    final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
    int musicVolume= audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
    audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, musicVolume, 0); 
    audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT); 

    int result = tts.setOnUtteranceProgressListener(new UtteranceProgressListener() { 

     @Override 
     public void onStart(String utteranceId) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onError(String utteranceId) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onDone(String utteranceId) { 
      // TODO Auto-generated method stub 
      audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); 
      System.out.println("done"); 
     } 
    }); 
    HashMap<String, String> params = new HashMap<String, String>(); 
    params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,"stringId"); 
    tts.speak(talk, TextToSpeech.QUEUE_FLUSH, params); 
    System.out.println("speaking after tts is over" + talk+" "+result); 

} 

Хотя Ringtone останавливается и tts играет, но после того, как tts играет Ringtone не возобновляется. Что мне делать?

ответ

8

Наконец, после того, как я почесал голову на два дня, я, наконец, сделал это. Для всех тех, кто хочет реализовать что-то подобное, но не в состоянии сделать это здесь код

public void speak(final String talk) throws InterruptedException { 
    final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
    int ringVolume = audioManager 
      .getStreamVolume(AudioManager.STREAM_RING); 
    int musicVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
    currentRingVolume = ringVolume; 

    musicVolume = (int) ((musicVolume * seekbarValue)/100); 

    if (PauseRingtone == true) { 
     audioManager.setStreamVolume(AudioManager.STREAM_RING, 1, 
       AudioManager.FLAG_SHOW_UI); 
    } else { 
     audioManager.setStreamVolume(AudioManager.STREAM_RING, 
       ringVolume, AudioManager.FLAG_SHOW_UI); 
    } 

    audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, musicVolume, 0); 

    int result = tts 
      .setOnUtteranceProgressListener(new UtteranceProgressListener() { 

       @Override 
       public void onStart(String utteranceId) { 
        // TODO Auto-generated method stub 

       } 

       @Override 
       public void onError(String utteranceId) { 
        // TODO Auto-generated method stub 

       } 

       @Override 
       public void onDone(String utteranceId) { 
        // TODO Auto-generated method stub 
        System.out.println("done"); 
        audioManager.setStreamVolume(AudioManager.STREAM_RING, 
          currentRingVolume, 0); 
       } 
      }); 
    HashMap<String, String> params = new HashMap<String, String>(); 
    params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "stringId"); 
    tts.speak(talk, TextToSpeech.QUEUE_FLUSH, params); 
    System.out.println("speaking after tts is over" + talk + " " + result); 

} 

объяснений: -

ringVolume - получает текущий объем мелодию .ie мелодия громкость, установленная в телефоне.

musicVolume - получает текущий объем музыки

currentRingVolume только сохраняет за собой ringVolume.

Примечание:STREAM_RING и STREAM_MUSIC - это разные вещи. См different volumes

Теперь основная идея заключается в том, чтобы muteringtone в то время как TTS говорит, а затем установить его на прежнее значение.

seekBarValue - мой SeekBar, который изображает уровень TTS объема w.r.t musicVolume и не является обязательным.

PauseRingtone - это CheckBox Preference, который проверяет, хотим ли мы приостановить рингтон во время разговора. Если true является сетов, AudioManager.STREAM_RING на 1 т.е. vibrate еще ringVolume т.е. Phone Value, так как TTS и Ringtone играть одновременно.

audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,musicVolume, 0) 

устанавливает объем TTS к musicVolume. После завершения TTS, то есть в onDone(), мы устанавливаем объем Ringtone обратно на ringVolume с использованием currentRingVolume.

Если мой ответ помог отметить мой ответ полезным.

+0

Я хочу остановить или приостановить воспроизведение музыкального проигрывателя, если tts начнет работать, и перезапустить музыкальный плеер, если tts stops.can вы можете помочь мне в этом. –

+0

Логика кодирования такая же, как я написал, я приостанавливал мелодию звонка, вам нужно приостановить воспроизведение музыкального проигрывателя. Если вы все еще не можете получить ответ, лучшим вариантом будет задать новый вопрос. –

+0

спасибо за ответ !! Я разрешаю проблему !! –

1

Избавьтесь от этого прослушивателя фокуса и добавьте этот код phoneStateListener. Это решит вашу проблему.

int mode = audioManager.getRingerMode(); 
int musicVolume= audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, musicVolume, 0); 
audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT); 

if(phoneState == TelephonyManager.CALL_STATE_IDLE) 
{ 

audioManager.setRingerMode(mode); 

} 
+0

В коде нет рингтона, который необходимо воспроизводить, кроме tts. Но я хочу играть на рингтоне после того, как tts перестала говорить. Как это сделать? –

+0

Если мой ответ помог любезно принять время, чтобы принять его. –

+0

Я использовал 'setOnUtteranceProgressListener' на' tts', а затем в 'onDone()' i использовал 'audioManager.setRingerMode (AudioManager.RINGER_MODE_NORMAL);'. Но это только положило телефон в нормальный режим. Нет мелодии звонка. –