在通过文本到语音说话然后恢复时暂停手机铃声

时间:2013-07-26 20:55:56

标签: android text-to-speech ringtone android-audiomanager

我正在使用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已播放但播放ttsRingtone未恢复。我该怎么办?

2 个答案:

答案 0 :(得分: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 - 获取手机中设置的铃声 .i.e铃声音量的当前音量。

musicVolume - 获取音乐

的当前音量

currentRingVolume只保留ringVolume

注意 - STREAM_RINGSTREAM_MUSIC是不同的事情。请参阅different volumes

现在基本的想法是mute ringtoneTTS正在发言,然后将其设置为之前的值。

seekBarValue - 是我的SeekBar,它描述了TTS卷w.r.t musicVolume的级别,并且是可选的。

PauseRingtone - 是CheckBox Preference,它会检查我们是否要在讲话时暂停铃声。如果trueAudioManager.STREAM_RING设置为1,即vibrate其他ringVolumePhone Value,那么TTS和{{1}同时玩。

Ringtone

audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,musicVolume, 0) 的音量设为TTS。在musicVolume完成发言后,即在TTS中,我们使用onDone()Ringtone的卷设置回ringVolume

如果我的回答有助于我的答案有用。

答案 1 :(得分: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);

}