Android TTS输出总是转到A2DP

Android TTS输出总是转到A2DP,android,bluetooth,text-to-speech,Android,Bluetooth,Text To Speech,我的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)); 我的理解是,到蓝牙耳

我的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));
我的理解是,到蓝牙耳机的音频路由工作方式是,
STREAM_MUSIC
转到
A2DP
(在Android蓝牙设置中称为“媒体音频”),而
STREAM_VOICE_CALL
转到
HSP
(在Android蓝牙设置中称为“手机音频”)

但是,无论我在我的小应用程序中使用
流式音乐
还是
流式语音呼叫
,音频总是出于某种原因进入
A2DP


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

如果您的耳机与a2dp配置文件兼容,则使用
AudioManager。流式播放音乐
,从而通过流播放音频应能完成任务

我还要补充一点,如果您当前正在通话,并且您通过语音流播放音频,那么任何耳机(a2dp或其他)都可以听到音频。不幸的是,你需要打电话。 不幸的是,我发现在_CALL中将mode设置为
mode\u没有任何作用

总而言之: 如果您只想播放音乐(不在通话中),请使用
AudioManager.STREAM_music
,如果耳机兼容A2DP,则会听到音乐


另外,请查看AudioManager.isBluetoothA2dpOn()
,以确保系统认为您的Headset已插入。

在大多数设备上,我的大部分功能都正常。以下是使用蓝牙SCO而不是A2DP在语音呼叫流上启动TTS的部分

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();
}
if(mTtsReady){
myHash=新的HashMap();
myHash.put(TextToSpeech.Engine.KEY_PARAM_outrance_ID,“A2DP_Vol”);
OLD_AUDIO_MODE=am2.getMode();
如果(SMSstream==1){
if(am2.isBluetoothsAvailableOffCall()){
am2.startBluetoothSco();
}
如果(!am2.isSpakerPhoneOn()){
speakerPhoneWasOn=false;
am2.设置扬声器(真);
}
myHash.put(TextToSpeech.Engine.KEY_PARAM_流,
String.valueOf(AudioManager.STREAM_VOICE_CALL));
am2.requestAudioFocus(空,AudioManager.STREAM\u语音呼叫,
AudioManager.AUDIOFOCUS_增益_瞬态);
}
否则{
am2.requestAudioFocus(空,AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_增益_瞬态);
myHash.put(TextToSpeech.Engine.KEY_PARAM_流,
String.valueOf(AudioManager.STREAM_MUSIC));
}
新的倒计时器(短信息延迟,短信息延迟/2){
@凌驾
公共无效onFinish(){
试一试{
mTts.speak(str,TextToSpeech.QUEUE\u ADD,
myHash);
}捕获(例外e){
Toast.makeText(应用程序,
R.string.ttsnotery,
Toast.LENGTH_LONG).show();
e、 printStackTrace();
}
}
@凌驾
公共void onTick(长arg0){
}
}.start();
}
现在,我只是有一个问题,让流恢复回来时完成。读TTS都很好。它将暂停任何音乐,播放TTS,然后恢复音乐。但是,当我稍后退出应用程序时,媒体流现在会通过手机听筒播放,直到我重新启动。我把这个问题贴在这里:


您可以在这里看到我的整个项目:

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

使用AudioManager startBluetoothSco启用SCO。然后收听AudioManager.ACTION_SCO_AUDIO_STATE_已更改广播,并将额外的_SCO_AUDIO_STATE设置为已连接的SCO_AUDIO_STATE_


如果您现在对语音流进行TextToSpeech,它最终会进入耳机(即使是便宜的非A2DP设备)。

谢谢,但我可能还没有解释我想做什么:我想通过非A2DP耳机播放TTS(文本到语音)输出。也就是说,我希望能够使用价格较低的耳机进行文字语音转换。毕竟,这只是声音,不是高保真音乐。。。可能吗+我认为这是不可能的,因为你必须改变系统的工作方式,可能是公司之间的一些事情(你抓我的背…)。。。但我不确定这是否难以置信。迟来的,谢谢你发布这个。接受,尽管我还没有在我的应用程序中测试此代码。