Android关于蓝牙mic和speaker的输入输出
来源:互联网 发布:身份证克隆软件下载 编辑:程序博客网 时间:2024/06/04 20:44
Android关于蓝牙mic和speaker的输入输出
转自 http://www.w3c.com.cn/android%E5%85%B3%E4%BA%8E%E8%93%9D%E7%89%99mic%E5%92%8Cspeaker%E7%9A%84%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA小弟最近在做一个项目就是使用蓝牙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录入,其他业务需要音频输出时,音频依旧可以从蓝牙出。
有大牛可以支持下吗?
楼主 – zhishui_Jolen:
3个回复
回复1楼 – ultrapro:通过蓝牙sco方式录音有的手机可以,有手机不行。回复2楼 – ultrapro:而且当你打开sco,手机播的音频应该是通过sco通道并不是a2dp经耳机播出的,并不会走手机的。当然了这个还要看厂商如何实现了。回复3楼 – zhishui_Jolen:那蓝牙mic除了sco方式还有哪些采集录音方法呢?本条目发布于 2014 年 1 月 13 日。属于 Android 分类。11 次浏览
硬件:蓝牙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录入,其他业务需要音频输出时,音频依旧可以从蓝牙出。
有大牛可以支持下吗?
楼主 – zhishui_Jolen:
3个回复
- Android关于蓝牙mic和speaker的输入输出
- 基于Dragonboard 410c的mic和speaker的loopback调试
- android 关闭和打开Speaker
- 打开关闭android的speaker
- a33-支持8723bu的蓝牙mic
- 硅咪/硅麦和驻极体MIC在蓝牙耳机方面的应用
- 一些关于mic的知识
- 使用蓝牙mic录音
- 关于android蓝牙的调试
- android 关于蓝牙的处理
- Android开发之--(WIFI,蓝牙,电池,背光,SD卡,摄像头,按键,MIC,重力感应等)功能的简单使用
- Android开发之--(WIFI,蓝牙,电池,背光,SD卡,摄像头,按键,MIC,重力感应等)功能的简单使用
- Android开发之--(WIFI,蓝牙,电池,背光,SD卡,摄像头,按键,MIC,重力感应等)功能的简单使用
- Android WIFI,蓝牙,电池,背光,SD卡,摄像头,按键,MIC,重力感应等)功能的简单使用 .
- Android开发之--(WIFI,蓝牙,电池,背光,SD卡,摄像头,按键,MIC,重力感应等)功能的简单使用
- Android开发之--(WIFI,蓝牙,电池,背光,SD卡,摄像头,按键,MIC,重力感应等)功能的简单使用
- Android开发之--(WIFI,蓝牙,电池,背光,SD卡,摄像头,按键,MIC,重力感应等)功能的简单使用
- Android开发之--(WIFI,蓝牙,电池,背光,SD卡,摄像头,按键,MIC,重力感应等)功能的简单使用
- CSS(三)解析盒子模型的浮动
- 字母树hdu4287
- VS中添加预处理宏的方法
- 丑数
- Leetcode: Generate Parenthesis
- Android关于蓝牙mic和speaker的输入输出
- uva10271 - Chopsticks(递推)
- android开发利器--站在巨人肩膀上前行
- 黑马程序员---内存
- 简单实现SYN端口扫描
- FreeRTOS代码剖析之2:内存管理Heap_2.c
- Spring+jdbc使用示例
- LeetCode | Substring with Concatenation of All Words(链接所有单词的子串)
- Oracle数据库SQL重要语法总结