Выход 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 подключен.

Другие вопросы по тегам