Intereting Posts
Как я могу использовать точку останова в Eclipse во время исполнения кода Android? Оптимизированный размер и dpi для изображений приложений Android Jenkins – используйте Genymotion VM вместо Android Emulator Повторное использование макета XML и кода Список выбора рингтонов Android с выбранным параметром по умолчанию Отображать всю музыку на SD-карте Как исправить предупреждение незащищенного SMS BroadcastReceiver Невозможно понять, как перехватить с помощью ImageViewTouch Android Notification Builder: как настроитьSound так, чтобы звук воспроизводился в петлере Ресурс Idpresso Idling не работает Сенсорное обнаружение на полилинии в Google Maps API Android v2 Дата получения последних 7 дней с текущего в Android Android: API Карт Google все еще свободен? Как программно перемещать, копировать и удалять файлы и каталоги на SD? Android GUI-архитектура – отношение между поверхностью / представлением / окном / холстом

Выход 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 гарнитуры?

Solutions Collecting From Web of "Выход TTS всегда идет на A2DP"

У меня это работает по большей части, на большинстве устройств. Вот часть, которая запускает 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/

Если ваша гарнитура совместима с профилем a2dp, то с помощью AudioManager.STREAM_MUSIC и, следовательно, воспроизведения звука через поток необходимо выполнить эту работу.

Я также хотел бы добавить, что если вы в настоящий момент находитесь в режиме разговора, и вы воспроизводите звук через речевой поток, тогда любая гарнитура (a2dp или иначе) может слышать звук. К сожалению, вам нужно позвонить. К сожалению, я обнаружил, что установка режима в MODE_IN_CALL ничего не делает.

Подводя итог: если все, что вы пытаетесь сделать, это воспроизведение музыки (если не в вызове), используйте AudioManager.STREAM_MUSIC и если гарнитура совместима с A2DP, тогда она услышит музыку.

Кроме того, взгляните на AudioManager.isBluetoothA2dpOn() , чтобы убедиться, что система думает, что ваш headeset подключен.

Да, можно воспроизвести вывод 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).