Android 关于蓝牙mic和speaker的输入输出

逆风而行 2014-01-10 03:40:43
小弟最近在做一个项目就是使用蓝牙mic录音,其他声音输出由蓝牙模块A2DP输出。
硬件:蓝牙2.1 支持RFcomm,A2DP
国内的很多帖子都转来转去的按照如下方式使用蓝牙mic录音:
private void startRecording() {
//获得文件保存路径。记得添加android.permission.WRITE_EXTERNAL_STORAGE权限
mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
mFileName += "/btrecorder.3gp";

mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setOutputFile(mFileName);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
try {
mRecorder.prepare();//如果文件打开失败,此步将会出错。
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}

if(!mAudioManager.isBluetoothScoAvailableOffCall()){
Log.d(LOG_TAG, "系统不支持蓝牙录音");
return;
}
//蓝牙录音的关键,启动SCO连接,耳机话筒才起作用
mAudioManager.startBluetoothSco();
//蓝牙SCO连接建立需要时间,连接建立后会发出ACTION_SCO_AUDIO_STATE_CHANGED消息,通过接收该消息而进入后续逻辑。
//也有可能此时SCO已经建立,则不会收到上述消息,可以startBluetoothSco()前先stopBluetoothSco()
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
int state = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1);

if (AudioManager.SCO_AUDIO_STATE_CONNECTED == state) {
mAudioManager.setBluetoothScoOn(true); //打开SCO
mRecorder.start();//开始录音
unregisterReceiver(this); //别遗漏
}else{//等待一秒后再尝试启动SCO
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mAudioManager.startBluetoothSco();
}
}
}, new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED));
}

三、停止录音
private void stopRecording() {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
if(mAudioManager.isBluetoothScoOn()){
mAudioManager.setBluetoothScoOn(false);
mAudioManager.stopBluetoothSco();
}
}

但是此种方法又有多少手机行得通?
经过我测试采用此种方法,录音有时能录,但是播放时会将原先可以从A2Dp输出的音频转到手机上,也就是说打乱了音频路由策略。

我的想法很简单就是在蓝牙耳机连接上时录音可以从蓝牙耳机mic录入,其他业务需要音频输出时,音频依旧可以从蓝牙出。

有大牛可以支持下吗?
...全文
5075 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
球球_1107 2016-05-22
  • 打赏
  • 举报
回复
哈哈,刚刚也碰到这个问题了。 我的看法是无解。 必须要去往下层,光是应用层面搞不定的。
quiteafew 2014-07-21
  • 打赏
  • 举报
回复
引用 5 楼 juen32 的回复:
我最近在研究蓝牙,能问下蓝牙mic的按钮怎么监听吗,比如按下可以说话的ptt键,api中写用ACTION_VENDOR_SPECIFIC_HEADSET_EVENT可接收,可是我怎么都都收不到,求帮助。 http://bbs.csdn.net/topics/390836668?page=1#post-397785652
要看按键之后的事件到底是什么啊,参考这篇博客吧: http://blog.sina.com.cn/s/blog_68028f880100u8te.html
juen32 2014-07-17
  • 打赏
  • 举报
回复
我最近在研究蓝牙,能问下蓝牙mic的按钮怎么监听吗,比如按下可以说话的ptt键,api中写用ACTION_VENDOR_SPECIFIC_HEADSET_EVENT可接收,可是我怎么都都收不到,求帮助。 http://bbs.csdn.net/topics/390836668?page=1#post-397785652
袁保康 2014-07-09
  • 打赏
  • 举报
回复
android原生带的gtalk可以实现你要求的功能,通话的时候使用sco(类似打电话),播放音乐的时候使用A2DP。但是我看还没有人把gtalk的源码研究出来是如何实现的,但是这也是一个方向。
逆风而行 2014-01-10
  • 打赏
  • 举报
回复
那蓝牙mic除了sco方式还有哪些采集录音方法呢?
儿大不由爷 2014-01-10
  • 打赏
  • 举报
回复
而且当你打开sco,手机播的音频应该是通过sco通道并不是a2dp经耳机播出的,并不会走手机的。当然了这个还要看厂商如何实现了。
儿大不由爷 2014-01-10
  • 打赏
  • 举报
回复
通过蓝牙sco方式录音有的手机可以,有手机不行。

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧