Intereting Posts
Динамический фрагмент Android Google Maps в держателе RecyclerView Android Spinner – Как сделать раскрывающийся список прозрачным? API возврата облачного слова API = UNAUTHENTICATED, причина = java.io.IOException: ошибка получения маркера доступа для учетной записи службы: Можно ли выбрать конкретный эмулятор устройств Android из AVD с помощью Apache Cordova? Анимация типа GIF для маркера в google map api ANDROID Android AdMob вызывает утечку памяти? Панель инструментов NavigationIcon потеряла тему Как освободить компонент в Android / iOS Эмулятор Android правильно отображает ресурсы иврита, но устройство не Как выполнить тестирование объекта с помощью google-api-client Как предотвратить автоматическую генерацию Android.mk с новым экспериментальным плагином gradle Android ADT bundle API Android Android v2 с настраиваемыми маркерами Cocos vs AndEngine для Android Ошибка компилятора: com.sun.tools.javac.code.Symbol $ CompletionFailure: файл класса для rx.Observable не найден

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

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