Android 蓝牙模块

前天想找个蓝牙录音程序,发现居然没有!没办法,就自己动手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的高。如果在进行操作。

Android 蓝牙模块,布布扣,bubuko.com

时间: 2024-11-03 21:45:11

Android 蓝牙模块的相关文章

android蓝牙模块

新建一个工程"blt". -----------------------MainActivity.java package com.example.blt; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Iterator

Android 蓝牙模块基础操作

之前没怎么接触过蓝牙模块,在学习的过程中借鉴了很多前辈的经验.本次主要包含以下功能: 1.检测是否存在蓝牙模块 2.蓝牙的开启与关闭 3.与本机已配对的蓝牙设备 4.本机蓝牙可见性设置 5.扫描周围蓝牙设备 关于蓝牙设备之间如何通讯下次再整理.下面开始介绍. 1.1.首先要在配置文件中加入操作蓝牙的权限 <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission and

Android蓝牙实例(和单片机蓝牙模块通信)

最近做毕设,需要写一个简单的蓝牙APP进行交互,在网上也找了很多资料,终于给搞定了,这里分享一下^_^. 1.Android蓝牙编程 蓝牙3.0及以下版本编程需要使用UUID,UUID是通用唯一识别码(Universally Unique Identifier),这是一个软件构建的标准,也是被开源基金会组织应用在分布式计算环境领域的一部分.在蓝牙3.0及下一版本中,UUID被用于唯一标识一个服务,比如文件传输服务,串口服务.打印机服务等,如下: #蓝牙串口服务 SerialPortService

【转】android蓝牙开发---与蓝牙模块进行通信--不错

原文网址:http://www.cnblogs.com/wenjiang/p/3200138.html 近半个月来一直在搞android蓝牙这方面,主要是项目需要与蓝牙模块进行通信.开头的进展很顺利,但因为蓝牙模块不在我这里,所以只能用手机测试.一开头就发现手机的蓝牙不能用,为了证明这点,我刷了四次不同不同系统的官方包,正式宣布手机的蓝牙报销了,于是和朋友换手机.在测试的过程中也是非常痛苦,放假了,同学都几乎回家了,剩下的同学中竟然80%都是用非android手机!我和我的小伙伴都吓呆了!!就算

Android bluetooth介绍(二): android 蓝牙代码架构及其uart 到rfcomm流程

关键词:蓝牙blueZ  UART  HCI_UART H4  HCI  L2CAP RFCOMM  版本:基于android4.2之前版本 bluez内核:linux/linux3.08系统:android/android4.1.3.4作者:xubin341719(欢迎转载,请注明作者,请尊重版权谢谢)欢迎指正错误,共同学习.共同进步!!一.Android Bluetooth Architecture蓝牙代码架构部分(google 官方蓝牙框架) Android的蓝牙系统,自下而上包括以下一些

Android Bluetooth模块学习笔记

一.蓝牙基础知识 1.蓝牙( Bluetooth )是一种无线技术标准,可实现固定设备.移动设备和楼宇个人域网之间的短距离数据交换.蓝牙基于设备低成本的收发器芯片,传输距离近.低功耗. 2.微波频段:使用2.402GGHz到2.480GHz(包括防护频带)的ISM波段的UHF无线电波 3.蓝牙使用跳频技术,将传输的数据分割成数据包,通过79个指定的蓝牙频道分别传输数据包.每个频道的频宽为1MHz. 4.蓝牙是基于数据包.有着主从架构的协议.一个主设备至多可和同一微微网中的七个从设备通讯.所有设备

Android蓝牙开发深入解析

1. 使用蓝牙的响应权限 代码如下: <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 2. 配置本机蓝牙模块 在这里首先要了解对蓝牙操作一个核心类BluetoothAdapter 代码如下: BluetoothAdapter

Arduino蓝牙模块实现通信

蓝牙参数特点 1.蓝牙核心模块使用HC-06从模块,引出接口包括VCC,GND,TXD,RXD,预留LED状态输出脚,单片机可通过该脚状态判断蓝牙是否已经连接 2.led指示蓝牙连接状态,闪烁表示没有蓝牙连接,常亮表示蓝牙已连接并打开了端口 3.输入电压3.6~6V,未配对时电流约30mA,配对后约10mA,输入电压禁止超过7V! 4.可以直接连接各种单片机(51,AVR,PIC,ARM,MSP430等),5V单片机也可直接连接 5.在未建立蓝牙连接时支持通过AT指令设置波特率.名称.配对密码,

[Android]蓝牙系统

1.1 蓝牙技术简介 蓝牙(Bleuetooth)原是十世纪统一了丹麦的一个国王的名字,现取其"统一"的含义,用来意在统一无线局域网通讯的标准的蓝牙技术.蓝牙技 术是爱立信,IBM,Intel等世界5家著名大公司在1998年联合推出的一项无线通讯规范.随后成立的蓝牙技术特殊兴趣组织(SIG)来负责该技术的 开发和技术协议的制定,如今全世界已有1800多家公司加盟该组织,最近微软公司也正式加盟并成为SIG组织的领导成员之一.它以低成本的近距离无线连接 为基础,为移动通信设备建立一个短程无