2013-07-26 20 views
4

我正在做一個來電講話的應用程序,使用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沒有恢復。我該怎麼辦?

回答

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 - 得到鈴聲 .IE鈴聲的當前音量在手機中設置的音量。

musicVolume - 得到音樂的當前音量

currentRingVolume只保留了ringVolume

注 -STREAM_RINGSTREAM_MUSIC是不同的東西。請參閱different volumes

現在基本思路是muteringtoneTTS正在說話,然後將其設置爲先前的值。

seekBarValue - 是我的SeekBar,它描述了體積w.r.t musicVolume的水平,並且是可選的。

PauseRingtone - 是一個CheckBox Preference,它檢查我們是否要在發言時暫停鈴聲。如果trueAudioManager.STREAM_RING設置爲1vibrate否則ringVolumePhone Value,因此TTSRingtone都同時播放。

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

設置的TTSmusicVolume音量。在TTS已經完成發言之後,即在onDone()中,我們使用currentRingVolumeRingtone的音量設置回ringVolume

如果我的答案幫助標記我的答案有用。

+0

如果tts開始工作,我想停止或暫停音樂播放器,如果tts停止, 重新啓動音樂播放器。您可以在此幫助我。 –

+0

編碼邏輯與我寫的相同,我暫停鈴聲,您需要暫停音樂播放器。如果你仍然無法得到答案,最好的選擇是提出一個新問題。 –

+0

感謝您的回覆!我解決了這個問題! –

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

} 
+0

該代碼不會播放除tts之外的鈴聲。但是我想在tts停止說話之後播放鈴聲。怎麼做? –

+0

如果我的回答有幫助,請花時間接受它。 –

+0

我在'tts'上使用了'setOnUtteranceProgressListener',然後在'onDone()'中使用了'audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);'。但是,這隻能讓手機進入正常模式。沒有鈴聲。 –