精华内容
下载资源
问答
  • AudioManager 蓝牙sco连接相关接口

    千次阅读 2019-07-02 16:05:52
    蓝牙耳机连接之后,发现音频发声的还是终端,并没有转换到蓝牙耳机发声。网上搜索相关资料,发现是蓝牙耳机需要建立链路来播放音频。 简单介绍下蓝牙耳机的两种链路:A2DP(异步链路)及SCO(同步链路)。A2DP是一...

    最近在做APP的蓝牙相关功能,想记录一下蓝牙的有关知识。俗话说的好呀,“好记忆,不如烂笔头”,关键我好像记性还不太好,哈哈哈~~

    蓝牙耳机连接之后,发现音频发声的还是终端,并没有转换到蓝牙耳机发声。网上搜索相关资料,发现是蓝牙耳机需要建立链路来播放音频。

    简单介绍下蓝牙耳机的两种链路:A2DP(异步链路)及SCO(同步链路)。A2DP是一种单向的高品质音频数据传输链路,通常用于播放立体声音乐;而SCO则是一种双向的音频数据的传输链路,该链路只支持8K及16K单声道的音频数据,只能用于普通语音的传输。我试过建立SCO连接后播放音乐效果一般。SCO主要用来传输对时间要求很高的数据通信,可以录音也能播放。A2DP只能播放。我做的app是关于语音对讲的,设置SCO就可以了。

    设置SCO的相关AudioManager接口

    1.AudioManager简介

    AudioManager 音频管理器,该类位于Android.Media包下。提供了音量控制与铃声模式相关操作。

    //获得AudioManager对象实例

    AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);

    2.具体接口

    当蓝牙耳机连接后,将音频从终端转换到蓝牙耳机。蓝牙耳机断开后,将音频从蓝牙耳机转换到终端。

    2.1打开SCO

    /**
     * 进入SCO模式
     */
    public void enterScoMode(){
      if(isBTConnected()){ //确保蓝牙连接
          AudioManager mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
          mAudioManager.startBluetoothSco(); //打开SCO;
          mAudioManager.setBluetoothScoOn(true); //蓝牙录音的关键,启动SCO连接,耳机话筒才起作用;
          setAudioMode(AudioManager.MODE_IN_COMMUNICATION);//将音频模式设为AudioManager.MODE_IN_COMMUNICATION,SCO才会真正生效。
      
      }
    
    }

    2.2关闭SCO

    /**
     * 关闭SCO
     */
    public void exitSCOMode(){
      AudioManager mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
      mAudioManager.setBluetoothScoOn(false);
      mAudioManager.stopBluetoothScoOn();
      mAudioManager.setAudioMode(AudioManager.MODE_NORMAL );
    }

    2.3判断通信是否使用蓝牙sco

    isBluetoothScoOn()

    2.4判断蓝牙耳机是否连接

    public void isBTConncected(BluetoothHeadset mBluetoothHeadset){
        boolean bt = false;
        if(mBluetoothHeadset != null){
         List<BluetoothDevice> devices = mBluetoothHeadset.getConnectedDevices();
          if(devices != null && devices.size() > 0)
            bt = ture;
        }else{
          BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
           if(adapter.getProfileConnectionState(BluetoothProfile.HEADSET) == 
              BluetoothProfile.STATE_CONNECTED){
                bt = true;
            }
         }
       return bt;
    
    }

    3.蓝牙耳机与耳机、终端之间的音频转换

    连接上蓝牙后,将音频从终端或者耳机上转换到蓝牙耳机输出;断开蓝牙后,将音频转换到终端或者耳机上输出。

    public void changeAudioOutput(){
      if(isBTConnected()){
        enterSCOMode();
        audioManager.setSpeakerPhoneOn(false);
    
      }else{
        if(audioManager.isWiredHeadsetOn()){
           audioManager.setSpeakerPhoneOn(false);
        }else{
            audioManager.setSpeakerPhoneOn(true);
        }
     
      }
    
    }
    
    //连接蓝牙时
    enterSCOMode();
    
    //断开蓝牙连接时;
    exitSCOMode();

     

    展开全文
  • 监听蓝牙连接上后建立sco打开蓝牙的操作有2种,它们的区别是什么呢? 1. 收BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED蓝牙连接的广播,如果是connected,调用AudioManager.startBluetoothSco()和...
  • 蓝牙sco连接源码

    2008-08-19 07:45:59
    ./blue, ./sco2raw, ./raw2sco. All this must be executed from same directory. <br>=== USE: AUDIO RECORDING/PLAYBACK === 1) load usu module (see \'usu\' USb ub User space on source forge) 2...
  • 蓝牙协议栈HFP SCO连接流程,基于android11

    蓝牙协议栈HFP SCO连接流程,基于android11

    展开全文
  • 蓝牙SCO与ACL链路

    2021-05-31 14:03:07
    蓝牙SCO与ACL链路 在主单元和从单元之间,可以确定不同的类型的蓝牙物理链路:ACL(Asynchronous Connection less),和另一种链路是SCO(Synchronous Connection Oriented)。SCO主要用于同步话音传送,ACL主要用于分组...

    在主单元和从单元之间,可以确定不同的类型的蓝牙物理链路:
    ACL:异步无链接(Asynchronous Connection less),ACL主要用于分组数据传送。
    SCO:同步定向链接(Synchronous Connection Oriented),SCO主要用于同步话音传送。

    一、SCO连接:

    为对称连接,利用保留时隙传送数据包。它主要用于:主单元和从单元之间实现点到点链接。连接建立后,主设备和从设备可以不被选中就发送SCO数据包。

    1)SCO数据包既可以传送话音,也可以传送数据,但在传送数据时,只用于重发被损坏的那部分的数据。

    2)另外SCO主要用来传输对时间要求很高的数据通信。

    3)SCO 链接由主单元发送SCO 建立消息,经链接管理(LM)协议来确立。该消息分组含定时参数(如SCO 间隔Tsco 和规定保留时隙补偿Dsco)等。

    二、ACL链路:

    就是定向发送数据包,它既支持对称连接,也支持不对称连接(既可以一对一,也可以一对多)。主要用于:主单元与网中的所有从单元之间实现一点多址的连接方式。

    1)主设备负责控制链路带宽,并决定微微网中的每个从设备可以占用多少带宽和连接的对称性。从设备只有被选中时才能传送数据。ACL链路也支持接收主设备发给微微网中所有从设备的广播消息。

    2)ACL 链接提供在主单元与所网中活动从单元的分组交换链接,异步和等时两种服务方式均可采用。在主―从之间,若仅是单个ACL 链接存在时,对大多数ACL 分组来说,分组重传是为确保数据的完整性而设立。

    3)在从―主时隙里,当且仅当先前的主―从时隙已被编址,则从单元允许返回一个ACL 分组。如果在分组头的从单元地址解码失败,它就不允许传输。

    4)ACL 分组未编址作为广播分组的指定从单元且各从单元可读分组。如果在ACL 链接上没有传输数据及没有轮询申请,那么在ACL 链接上就不存在发生传输过程。

    展开全文
  • Android蓝牙Sco

    2018-01-03 18:24:59
    "蓝牙正在取消连接" ) ; } else if (intent.getExtras().getInt(BluetoothHeadset. EXTRA_STATE ) == BluetoothHeadset. STATE_CONNECTING ) { Log. e ( TAG , "蓝牙正在连接" ) ; } } if (action....
    public class HeadsetReceiver extends BroadcastReceiver {
        private static final String TAG = "HeadsetReceiver";
        private AudioManager mAudioManager;
        private ComponentName mComponentName;
        private static HeadsetReceiver instance = null;
    
        private HeadsetReceiver() {
        }
    
        public static HeadsetReceiver getInstance() {
            if (instance == null) {
                synchronized (HeadsetReceiver.class) {
                    if (instance == null) {
                        instance = new HeadsetReceiver();
                    }
                }
            }
            return instance;
        }
    
        /**
         * 注册
         *
         * @param context
         */
        public void initial(Context context) {
            mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
            if (!mAudioManager.isBluetoothScoAvailableOffCall()) {
                Log.e(TAG, "系统不支持蓝牙录音");
                return;
            }
    
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
            intentFilter.addAction(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
            intentFilter.addAction(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED);
            context.registerReceiver(this, intentFilter);
            initAudioManager();
        }
    
        /**
         * 记得反注册
         *
         * @param context
         */
        public void deInit(Context context) {
            context.unregisterReceiver(this);
            instance = null;
        }
    
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            Log.e(TAG, "action==" + action);
            if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(action)) {
                Log.e(TAG, "拔出耳机1");
                resetSco();
                mHandler.removeCallbacksAndMessages(null);
            } else if (BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED.equals(action)) {
                if (intent.getExtras().getInt(BluetoothHeadset.EXTRA_STATE) == BluetoothHeadset.STATE_DISCONNECTED) {
                    Log.e(TAG, "蓝牙未连接");
                } else if (intent.getExtras().getInt(BluetoothHeadset.EXTRA_STATE) == BluetoothHeadset.STATE_CONNECTED) {
                    Log.e(TAG, "蓝牙已连接");
                    initAudioManager();
                } else if (intent.getExtras().getInt(BluetoothHeadset.EXTRA_STATE) == BluetoothHeadset.STATE_DISCONNECTING) {
                    Log.e(TAG, "蓝牙正在取消连接");
                } else if (intent.getExtras().getInt(BluetoothHeadset.EXTRA_STATE) == BluetoothHeadset.STATE_CONNECTING) {
                    Log.e(TAG, "蓝牙正在连接");
                }
            }
            if (action.equals(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED)) {
                int scoAudioState = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1);
                Log.e(TAG, "scoAudioState==" + scoAudioState);
                if (scoAudioState == AudioManager.SCO_AUDIO_STATE_CONNECTED) {
                    // This method should be called only after SCO is connected!
                    mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
                    mAudioManager.setBluetoothScoOn(true);
    
                    mHandler.removeCallbacksAndMessages(null);
                } else if (scoAudioState == AudioManager.SCO_AUDIO_STATE_DISCONNECTED) {
                    mHandler.removeCallbacksAndMessages(null);
                    resetSco();
                } else if (scoAudioState == AudioManager.SCO_AUDIO_STATE_CONNECTING) {
                    mHandler.sendEmptyMessageDelayed(TEST, 1000);
                }
            }
        }
    
        private void initMediaButton(Context context) {
            mComponentName = new ComponentName(context, MyMediaButtonReceiver.class);
            mAudioManager.registerMediaButtonEventReceiver(mComponentName);
        }
    
        private void unregisterMediaButton(Context context) {
            if (mComponentName != null) {
                mAudioManager.unregisterMediaButtonEventReceiver(mComponentName);
            }
        }
    
        private void initAudioManager() {
            resetSco();
            try {
                mAudioManager.startBluetoothSco();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        private void resetSco() {
            mAudioManager.setMode(AudioManager.MODE_NORMAL);
            mAudioManager.stopBluetoothSco();
            mAudioManager.setBluetoothScoOn(false);
            mAudioManager.setSpeakerphoneOn(false);
            mAudioManager.setWiredHeadsetOn(false);
        }
    
        private static final int TEST = 643;
        private Handler mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                Log.e(TAG, "888888888888888888888");
                this.sendEmptyMessageDelayed(TEST, 1000);
                mAudioManager.stopBluetoothSco();
                mAudioManager.setBluetoothScoOn(false);
                mAudioManager.startBluetoothSco();
            }
        };
    }
    展开全文
  • android 蓝牙sco开发

    千次阅读 2017-10-13 22:57:29
    state = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, - 1 ); Log.e( "SCO" , " mSCOHeadsetAudioState--->onReceive:" + state); if (state == AudioManager.SCO_AUDIO_STATE_CONNECTED) { Log...
  • 蓝牙连接sco问题

    千次阅读 2018-05-08 12:42:00
    之前开发蓝牙app的时候遇到了一个问题,想让蓝牙麦克风实时地接收语音信号,但是发现蓝牙咪头始终不能传入声音信号,只有手机的麦克风能够传入声音信号,查阅了资料,发现是sco没有设置好。经过多尝试后解决了问题,...
  • 背景: Rk3399上蓝牙SCO通话,发现音频很卡,后定位发现是原生的phone这个apk引起,于是屏蔽处理 屏蔽phone流程 1 ps进程查找包名 radio 656 197 1595616 103736 0 0000000000 S com.android.phone 2 对应包名...
  • 在很多应用中,都存在使用蓝牙进行录音。 首先我们写一个BroadcastReceiver,进行监听蓝牙状态改变。 public class BluetoothStatusRec extends BroadcastReceiver{ private String TAG = "BluetoothStatusRec";...
  • 如果需要使用蓝牙耳机录音,则需要通过打开蓝牙SCO通路实现。 二、获取权限 <uses-permission android:name="android.permission.RECORD_AUDIO" /><!-- 录音权限 --> <uses-permission android:...
  • 我试图通过SCO发送应用程序的所有音频.我能够成功发送音频,但是当有来电时,我需要断开SCO表格,以便应用音频不会干扰通话,问题是,当我尝试在通话后将音频重新路由到SCO时,它不起作用.这是我用来将音频发送到SCO的代码...
  • 转:蓝牙SCO与ACL链路

    2019-09-26 13:21:12
    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。...在主单元和从单元之间,可以确定不同的类型的蓝牙物理链路:ACL(AsynchronousConnectionless),和另一种链路是SCO(S...
  • 背景 由于项目需要,Rk3399需要兼容三块LCD屏,考虑到I2S0上有8个引脚,其 GPIO3_D4,GPIO3_D5,GPIO3_D6...rk3399 LCD兼容处理及解决蓝牙SCO通话异常断导致。按道理说这三个GPIO既可以用作I2S也可复用为GPIO,应该不影.
  • 建立通话,如何连接蓝牙耳机SCO

    千次阅读 2013-01-18 16:01:29
    1)通话之前,ACL是连接好的。在PoneApp里用了bluetoothhandfree这个类.在onCreate方法中,定义了bluetoothhandfree的对象,并把CM的信息传给了bluetoothhandfree类里。 if (BluetoothAdapter.getDefaultAdapter() !...
  • I faced problem with bluetooth SCO audio in my android app.I registered a receiver for actions ACL_CONNECTED and ACL_DISCONNECTED to capture the bluetooth SCO device connection and disconnection....
  • 传统蓝牙HCI连接的流程介绍

    千次阅读 2020-08-07 08:25:35
    第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。 第二篇:Transport层介绍,主要介绍蓝牙协议栈跟蓝牙芯片之前的硬件传输协议,比如基于UART的H4,H5,BCSP,...
  • 经典蓝牙连接过程

    2020-12-01 17:30:15
    经典蓝牙连接过程 想要了解蓝牙连接过程,必须先了解3个概念: 1,链路Link:物理链路,是基带协议中的概念,包括ACL链路和SCO链路两种,前者主要用于传递数据,后者传递语音。一对蓝牙设备,只存在一条ACL链路...
  • android蓝牙串口连接

    2019-03-14 10:12:40
    在做android蓝牙串口连接的时候一般会使用 BluetoothSocket tmp = null; 1 2 3 4 5 6 7 // Get a BluetoothSocket for a connection with the // given BluetoothDevice try { ...
  • 蓝牙HCI command/event/acl/sco格式介绍

    千次阅读 2020-07-29 07:46:31
    第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。 第二篇:Transport层介绍,主要介绍蓝牙协议栈跟蓝牙芯片之前的硬件传输协议,比如基于UART的H4,H5,BCSP,...
  • 这个帖子可能已经很久了,但对于那些可能尝试同样事情的...来自Android Dev网站:public void startBluetoothSco()从:API Level 8启动蓝牙SCO音频连接。需要许可:许可权。这种方法可以使用想要发送和的应用程序从...
  • 但每一个主从设备连接,支持1个ACL连接和3个SCO连接。 不过要注意,在ACL方式下使用的轮询机制:由主设备控制链路带宽,负责从设备带宽的分配,从设备依轮询发送数据。 ———————————————— 版权声明...
  • 零. 概述 由于HFP feature小节太多,所以我们计划本章把相近的feature合并,本文章主要讲下电话免提协议HFP(Hands-Free Profile)Audio Connection handing以及Audio ...1)Audio Connection set up(建立SCO连接) 2
  • 1.高通MSM8953和SDM450蓝牙电话(SCO)和蓝牙音乐(A2DP),这两个片子硬件设计是一样 <1>.蓝牙电话通路(SCO) 蓝牙接收:BT--->ADSP 注意:ADSP没有USB接口,所以不支持USB Headset,如果需要支持,需要修改BT...
  • android Bluetooth连接方式 SCO & ACL

    千次阅读 2014-06-22 21:04:53
    蓝牙物理链路ACL(Asynchronous Connectionless), 另外的一种链路是SCO(Synchronous Connection Oriented)主要用来传输对时间要求很高的数据通信。  蓝牙基带技术支持两种连接类型:同步定向... SCO连接为对称连接,
  • Android平台下,对普通耳机以及蓝牙耳机插拔状态的监控,代码中有做蓝牙耳机SCO通话建立

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,952
精华内容 780
关键字:

蓝牙sco连接