5

我正在制作一个呼叫者口语应用程序,它使用 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恢复。我应该怎么办?

4

2 回答 2

9

终于在挠了两天的头之后,我终于做到了。对于所有想要实现这样的东西但无法这样做的人,这里是代码

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_RINGSTREAM_MUSIC是不同的东西。看不同的体积

现在的基本思想是在说话muteringtone时候TTS,然后将其设置为以前的值。

seekBarValue- 是我的SeekBar,它描述了TTS音量 wrt的级别musicVolume并且是可选的。

PauseRingtone- 是一个CheckBox Preference检查我们是否想在说话时暂停铃声。If trueis 将 the 设置AudioManager.STREAM_RING1ie vibrateelse ringVolumeie Phone Value,因此两者TTS同时Ringtone播放。

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

将音量设置TTSmusicVolume。说完TTSie在onDone()我们把音量Ringtone调回原来ringVolumecurrentRingVolume

如果我的回答有助于标记我的回答有用。

于 2013-07-27T16:54:40.403 回答
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);

}
于 2013-07-26T21:52:49.657 回答