Приостановить мелодию телефона во время разговора через текст в речь, а затем возобновить

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

Обновить

Я использую этот код сейчас.

 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 не возобновляется. Что мне делать?

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

     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 – это разные вещи. Видеть Разные объемы

    Теперь основная идея – mute ringtone когда TTS говорит, а затем установить ее на предыдущее значение.

    seekBarValue – это мой SeekBar который отображает уровень громкости TTS musicVolume и не является обязательным.

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

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

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

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

    Избавьтесь от этого прослушивателя фокуса и добавьте этот класс 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); }