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

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

0 votes,  0.00 avg. rating ( 0% score)
小弟最近在做一个项目就是使用蓝牙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 次浏览
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值