2013-07-26 2 views
4

나는 TTS를 사용하여 발신자 이름을 말하는 발신자 말하기 응용 프로그램을 만들고 있습니다. TTS가 벨소리를 다시 시작하면서 말하는 동안 벨소리를 일시 중지하고 싶습니다. 조사한 바에 따르면 AudioFocus (희망 사항)을 사용할 수 있습니다. 어쨌든 난 다음 코드텍스트 음성 말하기와 재시작 중 전화 벨소리 일시 중지

지금이 코드를 사용하고

업데이트를 사용하고 있습니다. Ringtone 비록

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

} 

이 중지되고 tts이 재생됩니다 만 ttsRingtone이 재개되지 않고 재생됩니다. 어떻게해야합니까?

답변

8

마침내 2 일 동안 머리를 긁어 마침내했습니다.

ringVolume - - 벨소리 .IE 벨소리의 현재 볼륨을 가져옵니다 이런 식으로 뭔가를 구현하고자하지만, 이렇게 여기에서 할 수없는 모든 사람들에 대한 코드는

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

} 

explaination입니다 볼륨을 설정합니다.

musicVolume은 -

currentRingVolume 그냥 ringVolume 유지 음악의 현재 볼륨을 가져옵니다.

STREAM_RINGSTREAM_MUSIC은 다른 것들입니다. different volumes

TTS이 말하는 동안 기본 아이디어는 muteringtone이고 이전 값으로 설정됩니다.

-은 TTS 볼륨의 레벨을 나타내는 SeekBar이며 선택 사항입니다.

PauseRingtone - 말하는 동안 벨소리를 일시 중지할지 여부를 확인하는 CheckBox Preference입니다. true으로 설정하면 AudioManager.STREAM_RING1, 즉 vibrateringVolumePhone Value으로 설정하므로 TTSRingtone이 동시에 재생됩니다.

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

musicVolumeTTS의 볼륨을 설정합니다. TTS이 말하기를 마치면 onDone()에서 Ringtone의 볼륨을 ringVolume으로 다시 설정하고 currentRingVolume을 사용합니다.

내 대답이 내 대답을 유용하게 표시하는 데 도움이된다면.

+0

tts가 작동하기 시작하면 음악 플레이어를 중지하거나 일시 중지하고 음악 플레이어를 다시 시작하면 tts stops.can이 (가)이 문제를 해결할 수 있습니다. –

+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

'setOnUtteranceProgressListener'를'tts'에 사용하고'onDone()'에'audioManager.setRingerMode (AudioManager.RINGER_MODE_NORMAL); '를 사용했습니다. 그러나 그것은 단지 전화를 일반 모드로 둡니다. 벨소리가 없습니다. –

관련 문제