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

news/2024/10/18 16:54:13/

蓝牙打开后Setting界面变化及蓝牙搜索

参考:蓝牙扫描流程

  蓝牙打开后,BluetoothManagerService发出BluetoothAdapter.ACTION_STATE_CHANGED广播,Setting应用里面有很多地方注册接收该广播。其中settings/bluetooth/BluetoothEventManager.java里面有:
在这里插入图片描述
  LocalBluetoothAdapter.setBluetoothStateInt() -->LocalBluetoothProfileManager.setBluetoothStateOn()会判断Profile里面是否有已配对过的蓝牙设备,如果有,则进行自动配对。
  然后遍历、调用回调函数onBluetoothStateChanged(),DevicePickerFragment.java、CachedBluetoothDeviceManager.java、BluetoothSettings.java、DeviceListPreferenceFragment.java里面的onBluetoothStateChanged()会被调用。这里看BluetoothSettings.java的:
在这里插入图片描述
蓝牙打开后,界面如下:
在这里插入图片描述
下面分别解释“圈4”、“圈5”、“圈6”
  圈4:本机蓝牙设备的相关设置,包括本机蓝牙名称,蓝牙对附近可用设备的可见性,蓝牙对已经配对设备的可见性,当检测到蓝牙开启时会添加一个本机蓝牙信息的Preference,在方法updateContent中完成添加或者移除,添加代码如下:

在这里插入图片描述
preferencescreen添加或者移除的代码如下:

//添加一个种类的Preference
getPreferenceScreen().addPreference(mAvailableDevicesCategory);
.,....
//移除一个Preference
preferenceScreen.removePreference(mPairedDevicesCategory);
.....
//移除所有
Preference preferenceScreen.removeAll();

  圈5:已配对设备列表mPairedDevicesCategory,updateContent方法里面的代码:
在这里插入图片描述
圈6:附近可用设备列表mAvailableDevicesCategory
在这里插入图片描述
  updateContent方法最后的代码,分别判断已配对的蓝牙设备数量和扫描到的(可用的)设备数量,如果可用设备列表为空,则启动扫描。因为第一次打开蓝牙,还没有扫描记录,所以为空,且前面调用updateContent()传递下来的scanState=true,所以这里会进行扫描:
在这里插入图片描述
  另外,AndroidManifest.xml注册了DevicePickerActivity,该Activity用于蓝牙设置界面的蓝牙配置和管理,如果启动了这个Activity,在前面BluetoothEventManager.java处理BluetoothAdapter.ACTION_STATE_CHANGED广播时也会调用到DevicePickerFragment.java 的onBluetoothStateChanged(),这里也会进行startScanning。
  总之,上面调用的startScanning()最终都调用了LocalBluetoothAdapter.startScanning()
在这里插入图片描述
  如果参数force=false,则先判断是否扫描太频繁了(5分钟内扫描一次)、如果当前正使用A2DP播放音乐不进行扫描操作。
  下面会调到BluetoothAdapter.startDiscovery()>AdapterService.startDiscovery()> AS.startDiscoveryNative()>JNI里面的startDiscoveryNative()>再下面就到hw里面和bluetooth.start_discovery(void),这些暂时就不分析了,有兴趣的可以自行分析。

  Android 蓝牙应用开发,发现设备使用 startDiscovery()该进程为异步进程。该方法会立刻返回一个布尔值,指示是否已成功启动发现操作。发现进程通常包含约 12 秒的查询扫描,之后对发现的设备进行扫描,以检索其蓝牙设备的名字。
  蓝牙应用程序必须针对 BluetoothDevice.ACTION_FOUND Intent 注册一个 BroadcastReceiver,以便接受每台发现的设备的信息。针对每台设备,系统会广播 ACTION_FOUND Intent。这个 Intent 会携带额外的字段 EXTRA_DEVICE 和 EXTRA_CLASS。这两者分别包含 BluetoothDevice 和 BluetoothClass。
BluetoothEventManager.DeviceFoundHandler()
在这里插入图片描述
  根据底层传递过来的BluetoothDevice 和 BluetoothClass信息,构建一个CachedBluetoothDevice。CachedBluetoothDevice,缓存蓝牙设备,该类代表了一个远程设备,它包含了蓝牙设备的一些属性(例如蓝牙地址,名字,信号强度等)。可以通过这个类进行蓝牙设备的连接、配对、断开连接等功能,之所以命名为Cached,可能是因为它是临时存在的。
  之后调用dispatchDeviceAdded(),回调BluetoothSetting父类DeviceListPreferenceFragment.onDeviceAdded().
在这里插入图片描述
  创建一个BluetoothDevicePreference(继承Preference)并把它添加到mDeviceListGroup,mDeviceListGroup是PreferenceGroup类型,在DeviceListPreferenceFragment.onCreate()初始化:

mDeviceListGroup = (PreferenceCategory) findPreference(KEY_BT_DEVICE_LIST);

  当bluedroid扫描完成后,会告知Android上层扫描结束的广播,将回调package/apps/Bluetooth/src/com/android/bluetooth/btservice/JniCallbacks.java discoveryStateChangeCallback()–>AdapterProperties.discoveryStateChangeCallback()
在这里插入图片描述
  发送BluetoothAdapter.ACTION_DISCOVERY_FINISHED广播,最终被Setting软件的BluetoothEventManager.ScanningStateChangedHandler处理:
在这里插入图片描述
  有好几处地方注册了这个回调方法:
DevicePickerFragment.java
BluetoothPairingDetail.java
BluetoothSummaryUpdater.java
DeviceListPreferenceFragment.java,被BluetoothSettings.java重载
BluetoothDeviceUpdater.java
BluetoothSettings.java
  其中BluetoothSettings.java onScanningStateChanged()
在这里插入图片描述
  调用父类的onScanningStateChanged()
在这里插入图片描述
  代码很明显是为了更新UI。mDeviceListGroup已经在扫描过程中添加多个远程蓝牙设备的信息了,这里调用它的setProgress(),就是通知各个Preference刷新UI。


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

相关文章

CSR8811蓝牙音频发射一拖二解决方案

随着蓝牙技术的发展以及市场产品的多样化,越来越多的产品及应用场景需要用到蓝牙音频发射,比如后装车载中控、电摩仪表、便携式CD/DVD市场等。车载中控不拆原车主机,改装的系统声音通过蓝牙模块发射给原车主机,声音从原车功放输出…

如何把你的蓝牙耳机同时同地给两台不同的设备使用

如何让两台设备同时使用同一个蓝牙耳机 问题描述操作说明声明 问题描述 当你和舍友一起去跑步或者是一起去图书馆学习,但是只带了一副耳机,这个时候怎么办,如何让你们两个的播放设备都能连接这副耳机的其中一个,且播放各自的内容…

蓝牙设置和实现

蓝牙 为了让支持蓝牙的设备能够在彼此之间传输数据,它们必须先通过配对过程形成通信通道。其中一台设备(可检测到的设备)需将自身设置为可接收传入的连接请求。另一台设备会使用服务发现过程找到此可检测到的设备。在可检测到的设备接受配对…

设置蓝牙主从机上电自动配对的方法

有时候,我们希望蓝牙的主机在上电之后自动完成与从机的连接,而无需在每次上电后都发送一些AT指令来完成主从机的配对,该怎么做呢? 1、首先完成从机的设置: ATROLE0 //设置为从机 ATPSWDxxxx //xxxx是配对密码&#xff…

蓝牙(一)蓝牙设置详解

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

软件工程——第12章面向对象实现知识点整理

本专栏是博主个人笔记,主要目的是利用碎片化的时间来记忆软工知识点,特此声明! 文章目录 1. 面向对象语言技术的特点? 2.选择面向对象程序设计语言时主要应该考虑哪些因素? 3.面向对象设计结果只能用面向对象语言实…

微信小程序音频播放问题createInnerAudioContext为何不调用onTimeUpdate

废话不多说,直接这么写就可以解决: innerAudioContext.play(); innerAudioContext.onCanplay(() > { innerAudioContext.play(); console.log(开始播放) }); innerAudioContext.onWaiting(() > { innerAudioCo…

Android上调用百度人脸识别接口

写了一个简单的调用百度人脸识别在线的JAVA接口,识别率挺高的,但是目前写得还不是很全面,然后打开相册选取图片那一部分,以及工具类代码,是有参考别人写的代码,具体是摘自哪里之前没有保存。 这里贴一些主…