Android-在智能手机和蓝牙模块之间路由音频的功能

Android-在智能手机和蓝牙模块之间路由音频的功能,android,audio,routing,bluetooth,Android,Audio,Routing,Bluetooth,这是我关于Stackoverflow的第一篇文章。 在过去的几天里,我尝试在android智能手机上发送音频,但我没有找到合适的功能 它是用来制作蓝牙婴儿电话的 我需要在智能手机和蓝牙模块之间建立路由。蓝牙模块最初用于制造手机、汽车免提、无线扬声器 我与项目音频端的A2DP和HFP(免提)配置文件进行通信 我可以在设备之间建立“sco”连接(用于音频蓝牙交换的连接),并从蓝牙模块获取音频。但当连接“sco”工作时,我就不能再使用智能手机上的扬声器和麦克风了 我希望找到一个解决方案,在智能手机上使

这是我关于Stackoverflow的第一篇文章。 在过去的几天里,我尝试在android智能手机上发送音频,但我没有找到合适的功能

它是用来制作蓝牙婴儿电话的

我需要在智能手机和蓝牙模块之间建立路由。蓝牙模块最初用于制造手机、汽车免提、无线扬声器

我与项目音频端的A2DP和HFP(免提)配置文件进行通信

我可以在设备之间建立“sco”连接(用于音频蓝牙交换的连接),并从蓝牙模块获取音频。但当连接“sco”工作时,我就不能再使用智能手机上的扬声器和麦克风了

我希望找到一个解决方案,在智能手机上使用音频,同时在蓝牙模块上使用音频

我搜索了一个函数来路由音频

AudioManager类有一些函数来路由音频,比如setRouting或setParameters,但我还没有得到任何结果。

您可以在下面看到我用于从babyphone端(蓝牙模块端)获取音频的代码:

如果我不能将音频路由到智能手机扬声器,同时使用“sco”连接从babyphone侧的麦克风获取音频,我需要尽快了解它,以便改变我的项目方向

如果可能,智能手机端的babyphone程序需要在所有最新的智能手机上运行

英语不是我的第一语言,所以有些句子可能不正确


我愿意接受任何解决方案。

A2DP用于媒体播放,是单向的。SCO用于通过BT进行语音通话/VoIP/录音,是双向的,但质量较低

当您启用BluetoothSco并在通话中设置模式为
或在通话中设置模式为
时(至少在我使用过的大多数/所有设备上),将会发生的情况是
流式语音通话将被路由到BT\u SCO输出设备,并且输入设备将根据输出设备进行选择(因为该模式)这意味着BT_SCO输入设备

我的建议——虽然我不能保证它能在每台设备上工作——是不要在通信中设置模式为
setBluetoothScoOn(true)
呼叫将在内部设置“强制使用”设置以录制到BT_SCO,并将其与使用
默认值
语音识别
音频源相结合,应选择BT_SCO麦克风作为录制设备。
然而,从BT_SCO和内部麦克风同时录制可能无法以便携式方式进行。

对于输出,您可以使用
铃声
报警
音乐
流类型,当不在语音通话中时,这些流类型应该路由到内部扬声器,而不是BT_SCO。

@user2235813可能是音频源。摄像机可以打开使用内部麦克风的第二台录音机。@Michael,通过蓝牙路由呼叫在pjsip上可以正常工作,但当通过蓝牙连接的设备接收呼叫时,蓝牙耳机或耳机不会发出铃声,车载蓝牙也不会。任何人都有任何想法或建议。任何帮助或建议都将不胜感激。运气好吗?我正在尝试将我的蓝牙耳机的麦克风用作PA系统,换句话说,播放应该通过插孔(输出)进行,(我猜通过另一个蓝牙设备是不可能的)。看来这是不可能的
boolean isRecording=true;
int buffersize = 8000;
byte[] buffer = new byte[buffersize];

//audio configuration and SCO Bluetooth connection. 
AudioManager aManager = (AudioManager) getSystemService(AUDIO_SERVICE);
android.os.Process.setThreadPriority(
            android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
aManager.startBluetoothSco();
aManager.setBluetoothScoOn(true);
aManager.setMode(AudioManager.MODE_IN_COMMUNICATION);

//AudioRecord configuation for recording audio from babyphone.
AudioRecord  arec = new AudioRecord(
            MediaRecorder.AudioSource.VOICE_COMMUNICATION,
            8000,
            AudioFormat.CHANNEL_IN_MONO,
            AudioFormat.ENCODING_PCM_16BIT,
            buffersize); 

//AudioTrack configuation for sending audio to smartphone speaker.                
AudioTrack  atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
                8000,
                AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_16BIT,
                buffersize,
                AudioTrack.MODE_STREAM);

atrack.setPlaybackRate(8000);

//start audio recording and playing.
arec.startRecording();
atrack.play();

while(isRecording) {
    arec.read(buffer, 0, buffersize);

    atrack.write(buffer, 0, buffer.length);
}

arec.stop();
atrack.stop()