2. 蓝牙耳机主动跟Android 连首先BluetoothAudioGateway 会在一个线程中收到来自蓝牙耳机的RFCOMM 连接,然后发送消息给BluetoothHeadsetService。

mConnectingHeadsetRfcommChannel = -1;

mConnectingHandsfreeRfcommChannel = -1;

if(waitForHandsfreeConnectNative(SELECT_WAIT_TIMEOUT) == false) {

if (mTimeoutRemainingMs > 0) {

try {

Log.i(tag, "select thread timed out, but " +

mTimeoutRemainingMs + "ms of

waiting remain.");

Thread.sleep(mTimeoutRemainingMs);

} catch (InterruptedException e) {

Log.i(tag, "select thread was interrupted (2),

exiting");

mInterrupted = true;

}

}

}

BluetoothHeadsetService 会根据当前的状态来处理消息,分3 种情况,第一是当前状态是非连接状态,会发送RFCOMM_CONNECTED 消息,后续处理请参见前面的分析。

case BluetoothHeadset.STATE_DISCONNECTED:

// headset connecting us, lets join

setState(BluetoothHeadset.STATE_CONNECTING);

mHeadsetAddress = info.mAddress;

mHeadset = new HeadsetBase(mBluetooth, mHeadsetAddress,info.mSocketFd,info.mRfcommChan,mConnectedStatusHandler);

mHeadsetType = type;

mConnectingStatusHandler.obtainMessage(RFCOMM_CONNECTED).sendToTarget();

break;

如果当前是正在连接状态, 则先停掉已经存在的ConnectThread,并直接调用BluetoothHandsfree 去建立SCO 连接。

case BluetoothHeadset.STATE_CONNECTING:

// If we are here, we are in danger of a race condition

// incoming rfcomm connection, but we are also attempting an

// outgoing connection. Lets try and interrupt the outgoing

// connection.

mConnectThread.interrupt();

// Now continue with new connection, including calling callback

mHeadset = new HeadsetBase(mBluetooth,mHeadsetAddress,info.mSocketFd,info.mRfcommChan,mConnectedStatusHandler);

mHeadsetType = type;

setState(BluetoothHeadset.STATE_CONNECTED,BluetoothHeadset.RESULT_SUCCESS);

mBtHandsfree.connectHeadset(mHeadset,mHeadsetType);

// Make sure that old outgoing connect thread is dead.

break;

如果当前是已连接的状态,这种情况是一种错误case,所以直接断掉所有连接。

case BluetoothHeadset.STATE_CONNECTED:

if (DBG) log("Already connected to " + mHeadsetAddress + ",disconnecting" +info.mAddress);

mBluetooth.disconnectRemoteDeviceAcl(info.mAddress);

break;

蓝牙耳机也可能会主动发起SCO 连接, BluetoothHandsfree 会接收到一个SCO_ACCEPTED消息,它会去调用AudioManager 的setBluetoothScoOn 函数,从而通知音频系统有个蓝牙耳机可用了。到此,蓝牙耳机完成了和Android 的全部连接。

case SCO_ACCEPTED:

if (msg.arg1 == ScoSocket.STATE_CONNECTED) {

if (isHeadsetConnected() && mAudioPossible && mConnectedSco ==null) {

Log.i(TAG, "Routing audio for incoming SCO connection");

mConnectedSco = (ScoSocket)msg.obj;

mAudioManager.setBluetoothScoOn(true);

} else {

Log.i(TAG, "Rejecting incoming SCO connection");

((ScoSocket)msg.obj).close();

}

} // else error trying to accept, try again

mIncomingSco = createScoSocket();

mIncomingSco.accept();

break;

android蓝牙耳机接入,Android跟蓝牙耳机建立连接有两种方式相关推荐

  1. Java连接Oracle两种方式thin与oci区别

    Java连接Oracle两种方式thin与oci区别 前几天同事跑过来跟我说, 机房中的一台tomcat服务器跟oracle数据库机连接很慢,查看控制台中的hibernate日志, 基本上是一条sql ...

  2. Android通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比

    在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新.在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一是 ...

  3. android通用listview和gridview万能适配器实现的两种方式

    Listview和gridview是超级常用组件,于是乎,应该封装一下直接拿来用用而不是每次都写Adapter,这样多么的麻烦是不.虽然国内外大牛都有封装过,但是我总结了两个封装好的Adapter分享 ...

  4. Java中Http连接的两种方式

    在java中连接http,介绍两种方法,一种是java的HttpUrlConnection,另一种是apacha公司的httpClient,后者是第三方的类库需要从外部,导入,同时这也是第一次使用外部 ...

  5. Android中通过数组资源文件xml与适配器两种方式给ListView列表视图设置数据源

    场景 实现效果如下 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改 ...

  6. Android获取短信验证码并自动填充的两种方式

    有些项目为了方便客户操作,减去客户输入短信验证码的时间,会要求安卓app能够获取收到的短信验证码并自动填充到输入框.所以,我整理了安卓获取短信验证码并自动填充输入框的两种方法,而且正式在项目中使用并无 ...

  7. Android10下wifi连接的两种方式:点对点连接和外网连接

    因为Android下的API总是在变,权限越来越少.导致出现的问题层出不穷,所以我们只好按照官方手册去开发了. 在看了手册后,我们知道连接网络有两种: 1.点对点连接,意思就是我们直接去连接自己指定的 ...

  8. erl0007 - erlang 远程节点连接的两种方式

    启动连接:erl -setcookie abc -name xxx@192.168.x.x -remsh xxx@192.168.x.y 退出:ctrl + g,q 参考:http://www.cnb ...

  9. Mysql数据库远程连接的两种方式

    mysql 远程连接数据库的二种方法 一.连接远程数据库: 如:MySQL 连接远程数据库(192.168.5.116),端口"3306",用户名为"root" ...

最新文章

  1. Wordpress 加入html等文件
  2. Ubuntu20.04中安装shutter
  3. decode的mysql用法_MySQL DECODE( )用法及代码示例
  4. 在Linux下通过Wake On LAN实现网络唤醒远程开机
  5. c# 连接各种数据库 Access、Server等
  6. 计算机一级查询记录,技巧查看电脑中使用过的记录痕迹的详细教程
  7. angularjs增删改查数据_MongoDB数据读写操作(增删改查)总结
  8. python互斥锁_python互斥锁
  9. 简单的扫雷游戏代码(c++)
  10. phpcms整站代码分析
  11. php 百度地图 云存储,jspopular3.0 | 百度地图API SDK
  12. 怎么查看笔记本内存条型号_内存条,手把手教你怎么查看内存条的型号
  13. 方舟怎么看服务器信息,方舟怎么看服务器ip地址
  14. 外包程序员,如何提高自己跳出外包圈子?
  15. opencv自己生成标定板
  16. 7个免费的云平台,快来发布你的项目吧
  17. Android animation呼吸动画 心形动画
  18. AcWing-C/C++语法基础【合集2】
  19. strncasecmp函数
  20. Diary(一)——登录功能(上)

热门文章

  1. 服务器上怎么安装软件系统安装,怎么在云服务器上安装软件
  2. 实现视频人数统计python-flask-yolov5
  3. 将英文版Windows改为中文版
  4. 移动App自动化测试
  5. dlib 使用OpenCV,Python和深度学习进行人脸识别 源代码
  6. 局域网传文件_文件搜索神器Everything使用系列教程之——文件互传篇
  7. meg和bank_显卡和Pentium过热传奇终止...并且对ATI Radeon 256Meg 9800 Pro超频
  8. mx350显卡天梯图_笔记本电脑显卡分析(天梯图)
  9. 如何在 Windows 恢复环境中使用 Bootrec.exe 工具解决和修复 Windows Vista 中的启动问题
  10. Scanner调用next方法时报错NoSuchElementException原因,及对Scanner的一些总结