首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TTS输出总是转到A2DP

TTS输出总是转到A2DP
EN

Stack Overflow用户
提问于 2011-08-05 22:56:58
回答 3查看 8.7K关注 0票数 7

我的Android教程指出,我可以显式地告诉TTS引擎使用哪个流:

音乐回放:

代码语言:javascript
复制
params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_MUSIC));

至于电话:

代码语言:javascript
复制
params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_VOICE_CALL));

我的理解是,蓝牙耳机的音频路由可以使STREAM_MUSIC转到A2DP (即安卓蓝牙设置中的“媒体音频”),而STREAM_VOICE_CALL使用HSP (也称为安卓蓝牙设置中的“电话音频”)。

但是,无论我在我的小应用程序中使用STREAM_MUSIC还是STREAM_VOICE_CALL音频总是出于某种原因流向

我做错什么了?有没有办法将TTS输出路由到耳机的HSP配置文件?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-03 01:35:03

我在大部分设备上都能工作。这里是使用蓝牙SCO而不是A2DP在语音呼叫流上启动TTS的部分。

代码语言:javascript
复制
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,然后恢复音乐很好。然而,当我退出应用程序以后,媒体流现在播放通过手机耳机,直到我重新启动。我在这里发布了这个问题:Audio stream stays on earpiece after using AudioManager

您可以在这里看到我的整个项目:http://code.google.com/p/a2dpvolume/

票数 4
EN

Stack Overflow用户

发布于 2011-08-12 07:58:24

如果您的耳机与a2dp配置文件兼容,那么使用AudioManager.STREAM_MUSIC并通过流播放音频应该可以完成任务。

我还想补充一点,如果你目前在通话中,你通过语音流播放音频,那么任何耳机(a2dp或其他)都可以听到音频。不幸的是,你需要打个电话。不幸的是,我发现将模式设置为MODE_IN_CALL没有任何作用。

总结一下:如果你想要做的就是播放音乐(在没有呼叫的时候),那么使用AudioManager.STREAM_MUSIC,如果耳机是A2DP兼容的,那么它就会听到音乐。

另外,看一看AudioManager.isBluetoothA2dpOn(),以确保系统认为您的头部已插入。

票数 1
EN

Stack Overflow用户

发布于 2011-12-01 19:20:01

是的,可以通过非A2DP耳机播放TTS (文本到语音)输出,就像jroal说的那样。

使用AudioManager startBluetoothSco启用SCO。然后收听AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED广播,并将EXTRA_SCO_AUDIO_STATE设置为SCO_AUDIO_STATE_CONNECTED。

如果您现在对TextToSpeech流执行STREAM_VOICE_CALL,它将结束在耳机(甚至廉价的非A2DP设备)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6963461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档