前天想找个蓝牙录音程序,发现居然没有!没办法,就自己动手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, "系统不支持蓝牙录音");
        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);

}

总之记住如下的:

1)要使用蓝牙耳机的mic,则操作SCO这玩意。

2)如果要将音频输入到蓝牙耳机,则使用A2DP,(比如说打电话,语音播放呀什么的)这个玩意。

3)记住,SCO这个权限比A2DP的高。如果在进行操作。

转载于:https://www.cnblogs.com/wsfjlagr/p/3896087.html

Android 蓝牙模块相关推荐

  1. android蓝牙模块有哪些类型,蓝牙串口模块是什么?怎么用?有哪些种类?

    燚智能点评:蓝牙串口模块,分为经典蓝牙串口(4.0以前的)和BLE串口(4.0以后).经典蓝牙的速度快,和普通串口速度相当,功耗高.BLE的速度慢,也就1K每秒上下,但是功耗低. 如果做物联网产品的控 ...

  2. Android蓝牙串口通讯【转】

    本文转载自:http://blog.sina.com.cn/s/blog_631e3f2601012ixi.html Android蓝牙串口通讯 闲着无聊玩起了Android蓝牙模块与单片机蓝牙模块的 ...

  3. Android蓝牙通信

    Android蓝牙串口通讯 闲着无聊玩起了Android蓝牙模块与单片机蓝牙模块的通信,简单思路就是要手机通过蓝牙发送控制指令给单片机,并作简单的控制应用.单片机的蓝牙模块连接与程序暂且略过,此文主要 ...

  4. 关于Android蓝牙串口通信那点破事

    Android蓝牙串口通讯 闲着无聊玩起了Android蓝牙模块与单片机蓝牙模块的通信,简单思路就是要手机通过蓝牙发送控制指令给单片机,并作简单的控制应用.单片机的蓝牙模块连接与程序暂且略过,此文主要 ...

  5. android蓝牙BLE 有源码 有视频

    前序 ​ Google在android 4.3(API Level 18)的android版本中引入了低功耗蓝牙BLE核心API.低功耗蓝牙BLE也就是我们经常说的蓝牙4.0, 该技术拥有极低的运行和 ...

  6. 蓝牙模块hc05原理图_使用步进电机和Android App的蓝牙控制迷你升降机

    背景知识视频教程 使用App Inventor创建Android应用​viadean.com Arduino微控制器:学习Arduino制作项目 - 国外课栈​viadean.com Arduino ...

  7. Android BLE学习(二): Android与51822蓝牙模块通信流程的实现与分析

    http://www.itkeyword.com/doc/7802444777000507x499/android-BLE 背景 上一节介绍了蓝牙Android搜索BLE模块方法,搜索到蓝牙模块后,我 ...

  8. android蓝牙串口 hc06,Android手机通过蓝牙模块HC-06连接Arduino串口输出

    通过手机进行通信是可以实现很多遥控功能,虽然距离是比较短,一般是10米,但对于我这种新手做测试,比起买一个几百块的多通道遥控器成本要低很多. 实验目的:用Android实现蓝牙连接通过Arduino串 ...

  9. android蓝牙串口arduino源码,android – Arduino:使用串口和软件串口与蓝牙模块

    我的目的是使用Arduino使用HC-05蓝牙模块在PC和 Android设备之间建立通信. 我使用PC和Arduino(串行监视器)之间的USB通信和SoftwareSerial连接到HC-05. ...

最新文章

  1. 统计学习方法---拉格朗日对偶新性
  2. 保持函数依赖的模式分解可以减轻或解决什么_推荐系统玩家 之 因子分解机FM(Factorization Machines)...
  3. [leetcode]190. 颠倒二进制位
  4. web端跨域调用webapi
  5. HTML:在HTML前端界面中直接显示代码
  6. Retrofit的使用
  7. 使用Trace实现程序日志
  8. 计算机软考高级论文怎么写,【干货】软考高级论文怎么写易得高分?
  9. linux锐捷代码_Linux下锐捷上网操作
  10. IPD流程在华为15年发展历程…
  11. 一元云购qq互联回调地址错误解决办法
  12. 软件工程师考试报名须知
  13. 详解 LVS、Nginx 及 HAProxy 工作原理
  14. 基于PHP+Html+MySQL的网上手机商城系统
  15. python人脸识别项目_face++与python实现人脸识别签到(考勤)功能
  16. Linux中使用shell脚本向文件中写数据
  17. 一、Python语言概述
  18. 写论文时如何翻译外文文献?
  19. Java - 反射机制
  20. 2016年保密技术交流大会的璀璨之星—亿赛通

热门文章

  1. 深度学习二(Pytorch物体检测实战)
  2. HALCON学习之旅(五)
  3. 知识技能归档--CA-PKI体系-20210324
  4. HTML中制作循环广告条,一种循环展示广告的广告箱的制作方法
  5. java 2个小数点_在java程序中取后面两个小数点的方法
  6. java静态初始化模块,在静态初始化程序块中加载java属性
  7. 基于OPENldap搭建postfix 虚拟用户
  8. 精通SpringBoot---整合RabbitMQ消息队列
  9. 用css3的@keyframes里设置transform:rotate(); 当控制动画暂停:animation-play-state:paused暂停,在微信和safari里无效...
  10. [Android]BaseExpandableListAdapter实现可折叠列表