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

Я делаю приложение для разговора с вызывающим абонентом, которое произносит имя вызывающего абонента с использованием 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 не возобновляется. Что я должен делать?


person Rohan Kandwal    schedule 26.07.2013    source источник


Ответы (2)


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

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 - получает текущую громкость мелодии звонка, т.е. громкость мелодии звонка, установленную в телефоне.

musicVolume - получает текущую громкость музыки

currentRingVolume просто сохраняет ringVolume.

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

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

seekBarValue- это мой SeekBar, который отображает уровень TTS громкости относительно 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.

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

person Rohan Kandwal    schedule 27.07.2013
comment
Я хочу остановить или приостановить музыкальный проигрыватель, если tts начинает работать, и перезапустить музыкальный проигрыватель, если tts останавливается. Можете ли вы помочь мне в этом. - person Chaudhary Amar; 17.05.2016
comment
Логика кодирования такая же, как я написал, я приостанавливал мелодию звонка, вам нужно приостановить музыкальный проигрыватель. Если вы все еще не можете получить ответ, лучшим вариантом будет задать новый вопрос. - person Rohan Kandwal; 18.05.2016

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

 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);

}
person Umer Farooq    schedule 26.07.2013
comment
Код не создает никаких мелодий для воспроизведения, кроме tts. Но я хочу воспроизвести рингтон после того, как tts перестал говорить. Как это сделать? - person Rohan Kandwal; 27.07.2013
comment
Я использовал setOnUtteranceProgressListener на tts, а затем в onDone() я использовал audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);. Но это только переводило телефон в нормальный режим. Рингтона нет. - person Rohan Kandwal; 27.07.2013