【问题标题】:Pause Phone Ringtone while Speaking through Text To Speech and then Resume通过文字转语音通话时暂停电话铃声,然后恢复
【发布时间】:2013-07-27 06:53:33
【问题描述】:

我正在制作一个使用 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 未恢复。我该怎么办?

【问题讨论】:

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


    【解决方案1】:

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

    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 音量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() 中,我们使用currentRingVolume 将Ringtone 的音量设置回ringVolume。

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

    【讨论】:

    • 如果 tts 开始工作,我想停止或暂停音乐播放器,如果 tts 停止,我想重新启动音乐播放器。你能帮我吗?
    • 编码逻辑和我写的一样,我是暂停铃声,你需要暂停音乐播放器。如果您仍然无法得到答案,最好的选择是提出一个新问题。
    【解决方案2】:

    去掉这个焦点监听器并添加这个代码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);
    
    }
    

    【讨论】:

    • 该代码没有播放除 tts 以外的铃声。但我想在 tts 停止说话后播放铃声。该怎么做?
    • 我在tts 上使用了setOnUtteranceProgressListener,然后在onDone() 中我使用了audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);。但这只会将手机置于正常模式。没有铃声。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    相关资源
    最近更新 更多