La salida TTS siempre va a A2DP

Mi tutorial de Android indica que puedo explícitamente decirle al motor de TTS qué flujo utilizar:

Para la reproducción de música:

params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_MUSIC)); 

Y para llamadas telefónicas:

 params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_VOICE_CALL)); 

Mi entendimiento es que el enrutamiento de audio a un auricular Bluetooth funciona de tal manera que STREAM_MUSIC va a A2DP (también conocido como "audio de medios" en la configuración de Android Bluetooth) y STREAM_VOICE_CALL va a HSP (también conocido como "audio de teléfono" en la configuración de Android Bluetooth).

Pero independientemente de si utilizo STREAM_MUSIC o STREAM_VOICE_CALL en mi pequeña aplicación, el audio siempre va por alguna razón a A2DP .

¿Qué estoy haciendo mal? ¿Hay una manera de enrutar la salida TTS al perfil HSP los auriculares?

Tengo este trabajo en su mayor parte, en la mayoría de los dispositivos. Aquí está la parte que inicia el TTS en el flujo de llamadas de voz utilizando Bluetooth SCO en lugar de A2DP.

 if (mTtsReady) { myHash = new HashMap<String, String>(); myHash.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "A2DP_Vol"); OLD_AUDIO_MODE = am2.getMode(); if(SMSstream == 1){ if (am2.isBluetoothScoAvailableOffCall()) { am2.startBluetoothSco(); } if(!am2.isSpeakerphoneOn()){ speakerPhoneWasOn = false; am2.setSpeakerphoneOn(true); } myHash.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_VOICE_CALL)); am2.requestAudioFocus(null, AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); } else{ am2.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); myHash.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_MUSIC)); } new CountDownTimer(SMS_DELAY, SMS_DELAY/2) { @Override public void onFinish() { try { mTts.speak(str, TextToSpeech.QUEUE_ADD, myHash); } catch (Exception e) { Toast.makeText(application, R.string.TTSNotReady, Toast.LENGTH_LONG).show(); e.printStackTrace(); } } @Override public void onTick(long arg0) { } }.start(); } 

Ahora sólo tengo un problema para obtener la corriente para volver atrás cuando haya terminado. Todo funciona bien para leer TTS. Interrumpirá cualquier música, reproducirá el TTS y, a continuación, reanudará la música. Sin embargo, cuando salgo de la aplicación más tarde, el flujo de los medios se reproduce ahora a través del auricular del teléfono hasta que lo reinicie. He publicado esa pregunta aquí: Stream de audio se queda en auricular después de usar AudioManager

Puedes ver todo mi proyecto aquí: http://code.google.com/p/a2dpvolume/

Si su auricular es compatible con el perfil de a2dp, a continuación, utilizando AudioManager.STREAM_MUSIC y, por lo tanto, reproducir audio a través del flujo debe hacer el trabajo.

También añadiría que si está en una llamada y reproduce audio a través de la transmisión de voz, cualquier auricular (a2dp o de otro tipo) puede escuchar el audio. Desafortunadamente, usted necesita estar en una llamada. Desafortunadamente he encontrado que el ajuste del modo a MODE_IN_CALL no hace nada.

Para resumir: Si todo lo que está intentando hacer es reproducir música (cuando no está en una llamada), utilice AudioManager.STREAM_MUSIC y si el auricular es compatible con A2DP, escuchará la música.

También, echa un vistazo a AudioManager.isBluetoothA2dpOn() , para asegurarse de que el sistema piensa que su headeset está conectado.

Sí, es posible reproducir la salida TTS (texto a voz) a través de un auricular no A2DP como jroal dice usando SCO.

Utilice AudioManager startBluetoothSco para habilitar SCO. A continuación, escuche AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED difusión con el EXTRA_SCO_AUDIO_STATE establecido en SCO_AUDIO_STATE_CONNECTED.

Si ahora hace TextToSpeech al flujo STREAM_VOICE_CALL, terminará en el auricular (incluso los dispositivos no A2DP baratos).

  • NullPointerException durante el uso de TTS en CustomListview
  • TextToSpeech.setEngineByPackageName () devuelve el éxito incluso cuando el paquete no está disponible
  • Android TTS no habla gran cantidad de texto
  • Agrega mi motor TTS a Android TTS Serivce como SAPI
  • Texto a voz en android
  • La interfaz de usuario de texto a voz es un android lento
  • Android TextToSpeech: obtener la longitud de tiempo de audio
  • Android TTS añadir idiomas
  • Pausa tono del teléfono mientras habla a través de texto a voz y luego reanudar
  • ¿Qué en TtsService podría explicar la falta de onUtteranceCompleted () para playEarcon ()?
  • Desarrollo de aplicaciones similares a "Google ahora" - ¿es posible utilizar el reconocimiento de voz sin entrada de teclado?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.