Выход 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?


person an00b    schedule 05.08.2011    source источник


Ответы (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/< /а>

person jroal    schedule 03.09.2011
comment
Это невероятно. Запоздалое спасибо за публикацию этого. Принимаю, хотя я еще не тестировал этот код в своем приложении. - person an00b; 06.12.2011

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

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

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

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

person CornflakesDK    schedule 12.08.2011
comment
Спасибо, но, возможно, я не очень хорошо объяснил, что я хочу сделать: я хочу воспроизвести вывод TTS (преобразование текста в речь) через гарнитуру без A2DP. То есть хотелось бы иметь возможность использовать менее дорогие гарнитуры для преобразования текста в речь. Ведь это всего лишь голос, а не хай-фай музыка... Возможно ли это? +1 за попытку. - person an00b; 12.08.2011
comment
Ну, я на самом деле не думаю, что это возможно, потому что вам придется изменить способ работы системы, может быть что-то вроде (Вы почешите мне спину...) между компаниями... Но я не уверен - person CornflakesDK; 15.08.2011

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

person takilara    schedule 01.12.2011