Выход TTS всегда идет в A2DP
В моем руководстве по Android говорится, что я могу явно указать движку TTS, какой поток использовать:
Для воспроизведения музыки:
params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_MUSIC));
И для телефонных звонков:
params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_VOICE_CALL));
Насколько я понимаю, маршрутизация звука на гарнитуру Bluetooth работает так, что STREAM_MUSIC
идет к A2DP
(он же "медиа-аудио" в настройках Android Bluetooth) и STREAM_VOICE_CALL
идет к HSP
(он же "телефон аудио" в настройках Android Bluetooth).
Но независимо от того, использую ли я STREAM_MUSIC
или же STREAM_VOICE_CALL
в моем маленьком приложении аудио всегда идет по какой-то причинеA2DP
,
Что я делаю не так? Есть ли способ направить выход TTS на гарнитуру HSP
профиль?
3 ответа
Я получил это работает по большей части, на большинстве устройств. Вот часть, которая запускает TTS в потоке голосовых вызовов, используя Bluetooth SCO вместо 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();
}
Теперь у меня просто проблема с получением потока, чтобы вернуться обратно, когда закончите. Все отлично работает, чтобы прочитать TTS. Он приостановит любую музыку, воспроизведет TTS, а затем возобновит воспроизведение музыки. Однако при последующем выходе из приложения поток мультимедиа воспроизводится через телефонный наушник до перезагрузки. Я разместил этот вопрос здесь: Аудио поток остается на наушнике после использования AudioManager
Вы можете увидеть весь мой проект здесь: http://code.google.com/p/a2dpvolume/
Да, можно воспроизводить вывод TTS (текст-в-речь) через гарнитуру не A2DP, как говорит jroal, используя SCO.
Используйте AudioManager startBluetoothSco для включения SCO. Затем прослушайте трансляцию AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED с параметром EXTRA_SCO_AUDIO_STATE, установленным в значение SCO_AUDIO_STATE_CONNECTED.
Если вы сейчас выполните TextToSpeech для потока STREAM_VOICE_CALL, он окажется в гарнитуре (даже в дешевых устройствах, не поддерживающих A2DP).
Если ваша гарнитура совместима с профилем a2dp, используйте AudioManager.STREAM_MUSIC
и, следовательно, воспроизведение аудио через поток должно завершить работу.
Я также добавил бы, что если вы в данный момент находитесь в режиме разговора и воспроизводите аудио через голосовой поток, то любая гарнитура (a2dp или иная) может слышать звук. К сожалению, вам нужно быть на связи. К сожалению, я обнаружил, что установка режима на MODE_IN_CALL
ничего не делает.
Подводя итог: Если все, что вы пытаетесь сделать, это воспроизводить музыку (когда нет разговора), то используйте AudioManager.STREAM_MUSIC
и если гарнитура совместима с A2DP, то она услышит музыку.
Кроме того, взгляните на AudioManager.isBluetoothA2dpOn()
, чтобы убедиться, что система считает, что ваш headeset подключен.