Pausa tono del teléfono mientras habla a través de texto a voz y luego reanudar

Estoy haciendo un llamador que habla la aplicación que hablan nombre del llamador usando TTS. Quiero pausar el tono mientras TTS está hablando y luego reanudar el tono de llamada. De lo que he investigado podemos usar AudioFocus (espero que sí). De todos modos estoy usando el siguiente código

Actualizar

Estoy usando este código ahora.

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

Aunque se ha detenido el Ringtone y tts se reproduce pero después de tts se reproduce Ringtone no se reanuda. ¿Que debería hacer?

Finalmente después de rascarme la cabeza durante dos días finalmente lo hice. Para todos aquellos que quieren implementar algo como esto, pero no pueden hacerlo aquí es el código

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

Explicación

ringVolume – obtiene el volumen actual del volumen de ringtone .ie ringtone establecido en el teléfono.

musicVolume – obtiene el volumen actual de la música

currentRingVolume sólo conserva el ringVolume del ringVolume .

Nota: STREAM_RING y STREAM_MUSIC son cosas diferentes. Ver Diferentes volúmenes

Ahora la idea básica es mute el ringtone mientras TTS está hablando y luego ponerlo a valor anterior.

seekBarValue – es mi SeekBar que representa el nivel del volumen de TTS volumen de musicVolume y es opcional.

PauseRingtone – es una CheckBox Preference que comprueba si queremos pausar el tono de llamada mientras hablamos. Si true es establecer el AudioManager.STREAM_RING a 1 es decir, vibrate otro modo ringVolume es decir, el Phone Value , para que tanto TTS como el Ringtone reproduzcan al mismo tiempo.

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

Establece el volumen de TTS en musicVolume . Después de que TTS haya terminado de hablar, por ejemplo, en onDone() , establecimos el volumen del Ringtone retorno en el volumen de Ringtone usando currentRingVolume .

Si mi respuesta ayudó a marcar mi respuesta útil.

Deshacerse de este oyente de enfoque y agregar este código phoneStateListener clase. Esto resolverá su problema.

  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); } 
  • Android TTS no habla gran cantidad de texto
  • ¿Cómo puedo guardar la salida TTS en un archivo de audio en android?
  • ¿Cómo puedo guardar mi android tts salida en un archivo wav?
  • Transmisión de notificaciones de texto a voz durante la conducción
  • TextToSpeech versión de compilación android no reproduce audio
  • Android: escucha un comando de voz (todo el tiempo)
  • Inicializar el objeto TextToSpeech en un subproceso de trabajo
  • ¿Cómo instalar el motor TTS específico programáticamente en Android?
  • ¿Qué en TtsService podría explicar la falta de onUtteranceCompleted () para playEarcon ()?
  • Otras opciones de la biblioteca de Android TextToSpeech
  • Cómo encuestar los motores TTS disponibles para los idiomas disponibles sin instanciar cada uno y wating para init
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.