找回密码
 立即注册

使用微信账号登录

只需一步,快速开始

查看: 11478|回复: 7

[经典蓝牙协议栈] android蓝牙耳机录音程序主要代码

[复制链接]

暂无签到数据

发表于 2013-3-10 22:02:39 | 显示全部楼层 |阅读模式

马上注册,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册  

×
本帖最后由 goldenwater 于 2013-3-10 22:06 编辑

     前天想找个蓝牙录音程序,发现居然没有!没办法,就自己动手DIY了。一些关键代码摘出来,希望对大家有用。
    本代码基于android 2.2以上。IOS就不要问我了,不越狱的IOS设备,蓝牙除了用蓝牙耳机,再就是IOS设备之间联机游戏,不可理喻!

一、初始化

添加权限:
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />


......
    private static String mFileName = null;
    private MediaRecorder mRecorder = null;
    private MediaPlayer   mPlayer = null;
    private AudioManager mAudioManager = null;
......
    mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
......
     


二、录音
   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, "系统不支持蓝牙录音&quot;);
        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   
    private void startPlaying() {
        mPlayer = new MediaPlayer();
        try {
            if(!mAudioManager.isBluetoothA2dpOn()) mAudioManager.setBluetoothA2dpOn(true); //如果A2DP没建立,则建立A2DP连接
            mAudioManager.stopBluetoothSco();//如果SCO没有断开,由于SCO优先级高于A2DP,A2DP可能无声音
            try {
Thread.sleep(500);
   } catch (InterruptedException e) {
e.printStackTrace();
            }
            mAudioManager.setStreamSolo(AudioManager.STREAM_MUSIC, true);
            //让声音路由到蓝牙A2DP。此方法虽已弃用,但就它比较直接、好用。
            mAudioManager.setRouting(AudioManager.MODE_NORMAL, AudioManager.ROUTE_BLUETOOTH_A2DP, AudioManager.ROUTE_BLUETOOTH);
           mPlayer.setDataSource(mFileName);
            mPlayer.prepare();
            mPlayer.start();
        } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
        }
    }

五、停止A2DP播放   
    private void stopPlaying() {
        mPlayer.release();
        mPlayer = null;
        mAudioManager.setStreamSolo(AudioManager.STREAM_MUSIC, false);   
    }
楼主热帖
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
连续签到天数:1天
签到总天数:541天
签到总奖励:6436金币
发表于 2013-4-29 18:27:43 | 显示全部楼层
多谢楼主!学习中
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:2天
签到总天数:67天
签到总奖励:479金币
发表于 2013-11-12 08:52:48 | 显示全部楼层
好好学习天天向上
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

暂无签到数据

发表于 2013-11-21 22:59:50 | 显示全部楼层
这个要多学习学习
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:1天
签到总奖励:3金币
发表于 2014-2-13 10:42:20 | 显示全部楼层
给力呀,大大
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

暂无签到数据

发表于 2014-8-4 00:41:15 | 显示全部楼层
对goldenwater的敬仰犹如滔滔之水连绵不绝!
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:1天
签到总奖励:6金币
发表于 2014-8-14 18:07:59 | 显示全部楼层
强悍那,相当之佩服
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:666天
签到总奖励:9548金币
发表于 2014-12-9 08:59:04 | 显示全部楼层
mark!
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册  

本版积分规则

小黑屋|手机版|我爱蓝牙网 - 52Bluetooth

GMT+8, 2024-4-29 14:20 , Processed in 0.181751 second(s), 24 queries , Gzip On, MemCached On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表