Android 9 原生设置关于蓝牙设置(五)

news/2024/11/20 0:30:16/

蓝牙配对及A2DP连接

参考:蓝牙配置流程

  当点击设置界面的某个蓝牙设备时会调用DeviceListPreferenceFragment里面:
在这里插入图片描述
  最终调用BluetoothDevicePreference.onClicked(),主要代码如下:
在这里插入图片描述
  上面的逻辑里会根据不同的情况执行不同的逻辑,一目了然。

蓝牙配对

  调用CachedBluetoothDevice.startPairing()
在这里插入图片描述
  配对之前,如果当前处于蓝牙扫描状态,则停止蓝牙扫描。然后调用createBond()开始绑定(即配对)了。
  BluetoothDevice.createBond()>adapterservice.createBond()>adapterservice.createBond()>向状态机发送绑定消息》  BondStateMachine.createBond()>AdapterService.createBondNative()>JNI==>hw,
在这里插入图片描述

蓝牙连接

  当配对成功之后,会发送BONDING_STATE_CHANGE消息到BondStateMachine:
  BondStateMachine::PendingCommandState.processMessage()
在这里插入图片描述
  调用BondStateMachine::PendingCommandState.sendIntent()发ACTION_BOND_STATE_CHANGED消息给应用软件:
在这里插入图片描述
  上面先调用了AdapterProperties.onBondStateChanged(),其中调用setBondState更新远程设备的Bond状态。
  ACTION_BOND_STATE_CHANGED消息给Setting软件的BluetoothEventManager处理,比如接收到bond完成事件BondStateChangedHandler,里面调用了

            cachedDevice.onBondingStateChanged(bondState);

在这里插入图片描述
  这里省略一些逻辑,之后调用到connectAutoConnectableProfiles()
在这里插入图片描述
  for循环遍历了所以支持的蓝牙协议,如果该协议允许自动连接,则尝试connect。
在这里插入图片描述
  连接成功会有以下打印:
在这里插入图片描述
这里了解一下A2dpProfile.connect()
在这里插入图片描述
  先断开已经连接的A2DP远程设备,再连接指定的设备。
A2dpProfile.connect()–>BluetoothA2dp.connect()–>A2dpService.connect() 发送A2dpStateMachine.CONNECT给状态机–>A2dpStateMachine.Disconnected.processMessage() -->connectA2dpNative(),连接超时时间是30秒。
在这里插入图片描述
在这里插入图片描述
  上面代码
  (1)处是发送一个连接蓝牙状态改变事件。
  (2)进行a2dp连接,很明显就要进入jni里了
  (3)把要连接的远程蓝牙设备设置为目标设备mTargetDevice,状态转换到==》pending==>connected
这里只讲连接,所以下面要分析jni了。com_android_bluetooth_a2dp.cpp

static jboolean connectA2dpNative(JNIEnv *env, jobject object, jbyteArray address) {jbyte *addr;bt_bdaddr_t * btAddr;bt_status_t status;ALOGI("%s: sBluetoothA2dpInterface: %p", __FUNCTION__, sBluetoothA2dpInterface);if (!sBluetoothA2dpInterface) return JNI_FALSE;addr = env->GetByteArrayElements(address, NULL);btAddr = (bt_bdaddr_t *) addr;if (!addr) {jniThrowIOException(env, EINVAL);return JNI_FALSE;}if ((status = sBluetoothA2dpInterface->connect((bt_bdaddr_t *)addr)) != BT_STATUS_SUCCESS) {ALOGE("Failed HF connection, status: %d", status);}env->ReleaseByteArrayElements(address, addr, 0);
return (status == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
}

  那么这个sBluetoothA2dpInterface这个是什么呢?其实这个就相当于java中对外提供的api接口,只是在c中是头文件而已。既然是蓝牙肯定是在蓝牙的头文件里bt_av.h里

typedef struct {/** set to sizeof(btav_interface_t) */size_t          size;/*** Register the BtAv callbacks*/bt_status_t (*init)( btav_callbacks_t* callbacks );/** connect to headset */bt_status_t (*connect)( bt_bdaddr_t *bd_addr );/** dis-connect from headset */bt_status_t (*disconnect)( bt_bdaddr_t *bd_addr );/** Closes the interface. */void  (*cleanup)( void );
} btav_interface_t;

  接下来就调用到./btif/src/btif_av.c,此处省略。
  

  蓝牙A2DP连接成功,bluedroid回调com_android_bluetooth_a2dp.cpp bta2dp_connection_state_callback(),然后回调A2dpStateMachine.onConnectionStateChanged()
在这里插入图片描述
  发送STACK_EVENT消息,因当前状态是Pending,所以调用Pending.processMessage():
在这里插入图片描述
processConnectionEvent()
在这里插入图片描述
在这里插入图片描述
发送MSG_CONNECTION_STATE_CHANGED消息,留意下参数内容。
在这里插入图片描述
  发送BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED广播,并把状态信息传递过去。另外会调用notifyProfileConnectionStateChanged(),修改Profile的优先级等(因为蓝牙带宽是有限的)。
  在LocalBluetoothProfileManager.updateLocalProfiles()有注册接收BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED广播,由StateChangedHandler类处理广播:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  cachedDevice.refresh()–>dispatchAttributesChanged()–>BluetoothDevicePreference.onDeviceAttributesChanged(),更新了UI界面关于蓝牙远程设备对应的Prcference。


http://www.ppmy.cn/news/836867.html

相关文章

手机蓝牙控制开关

先讲一下整体思路哈!手机肯定不能直接控制台灯的,需要一个中间物来协调,在这里我用的是51单片机(如果大家不知道也没关系,下面我还会说的)。接下来就是具体怎么控制的,其实原理挺简单的。1.手机…

算法-快速排序

go快速排序 时间复杂度:O(n) 空间复杂度:O(Nlog2n) 不稳定,较复杂 过程: 1、设置一个基点,通常为最左边或最右边,下面设置为最左边,设置设置两个指针分别指向数组两端 2、先移动右边指针,如果小于基点的值,则停止移动,并且把值覆盖到最左边的指针的值 3、覆盖之后,把最左边的指…

蓝牙广播时间设置

1CONN_INTERVAL (连接间隔) 就是两个连接事件之间的时间间隔,连接间隔以1.25为单位,连接间隔的值为6(7.5ms)~3200(4s).不同的应用可能要求不同的时间间隔。长的时间间隔的优势是显著地节省功耗,因为设备可以在连接事件…

【蓝牙模块】多主多从蓝牙模块介绍

蓝牙模块测试:多主多从模块测试步骤 FR8016HA_Module 透传模块介绍蓝牙模块测试:多主多从测试*有需要的可以联系:13631472459*模块图片 FR8016HA_Module 透传模块介绍 FR8016HA_Module模块是一款工业 级射频无线产品,支持蓝牙5.0…

Android 9 原生设置关于蓝牙设置(三)

开启关闭蓝牙 参考:https://www.jianshu.com/p/a150d55e29ca 开启过程 参考“Setting关于蓝牙的界面”,开启和关闭蓝牙的switchbar的监听状态是BluetoothEnable类,当打开switchbar时: LocalBluetoothAdapter.setBluetoothEnab…

Android 9 原生设置关于蓝牙设置(一)

原生设置中关于蓝牙设置相关的类 BluetoothSettings.java 该类是蓝牙配置和连接管理界面,就是咱们常见的蓝牙界面。它管理着蓝牙界面的加载,蓝牙搜索,蓝牙连接,蓝牙重命名等管理功能。(顺便借用一下大牛做的图片:http…

HC-06蓝牙模块设置和使用方法

HC-06的设置方法 1.给蓝牙上电 给HC-06上电之后,HC-06的指示灯会不停地闪烁,这个时候就标志着进入AT模式了 2.有线串口连接 这时,可以选择有线串口连接的方式,将单片机和电脑连接起来,假设使用的是51开发板 3.蓝牙引脚…

Android 9 原生设置关于蓝牙设置(四)

蓝牙打开后Setting界面变化及蓝牙搜索 参考:蓝牙扫描流程 蓝牙打开后,BluetoothManagerService发出BluetoothAdapter.ACTION_STATE_CHANGED广播,Setting应用里面有很多地方注册接收该广播。其中settings/bluetooth/BluetoothEventManager.ja…