Android4.42-Setting源码分析之蓝牙模块Bluetooth(下)

本文深入分析Android4.4蓝牙模块的实现,包括获取已配对设备、设备列表加载、搜索附近设备、蓝牙配对与连接的源码细节。介绍了BluetoothEventManager、LocalBluetoothProfileManager等关键类的作用,并梳理了相关蓝牙广播。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接着上一篇   Android4.42-Settings源码分析之蓝牙模块Bluetooth(上)

继续蓝牙模块源码的研究


THREE,蓝牙模块功能实现

switch的分析以及本机蓝牙重命名和可见性的分析见上一篇,接下来进行第三章第三部分的介绍:关于蓝牙远程设备列表的加载。如果没有看过,建议看看上一篇关第一章蓝牙的布局,有助于理解

3>,设备列表的加载

因为这部分代码很多,所以在介绍时先说一下思路,程序首先通过底层的BluetoothAdapter的getBondedDevices()方法获取到已配对的设备列表,获取到列表后将数据缓存在List<CachedBluetoothDevice>中进行备份,当蓝牙界面启动后会从缓存中读取数据并显示已配对设备列表mPairedDevicesCategory,在扫描附近可用设备时会对缓存中的数据进行增加或者删除,并将数据显示在可用设备列表mAvailableDevicesCategory,并且程序会实时监听远程设备的状态变化,进行对设备列表的增加或删除。设备列表的加载基本上就是这些,接下来挨个介绍

i>,调用底层代码获取可用设备列表并进行缓存

这部分代码的书写在BluetoothEventManager.java文件中,获取已配对设备列表的代码定义如下,

boolean readPairedDevices() {
       //mLocalAdapter是将BluetoothAdapter映射到本地,其内部代码不再书写,获取到已配对设备
       Set<BluetoothDevice> bondedDevices = mLocalAdapter.getBondedDevices();
        if (bondedDevices == null) {
            return false;
        }
        boolean deviceAdded = false;
        for (BluetoothDevice device : bondedDevices) {
            //这一步调用的是设备缓存列表的管理类CachedBluetoothDeviceManager中的方法findDevice
            //用于检查缓存列表中是否已经存在该device,若存在就将device返回,若不存在就返回null
            CachedBluetoothDevice cachedDevice = mDeviceManager.findDevice(device);
            if (cachedDevice == null) {
                //如果缓存列表中没有该设备就调用管理类CachedBluetoothDeviceManager中的addDevice
                //将设备添加到缓存列表中
               cachedDevice = mDeviceManager.addDevice(mLocalAdapter, mProfileManager, device);
              //将设备更新到屏幕上
               dispatchDeviceAdded(cachedDevice);
                deviceAdded = true;
            }
        }
        return deviceAdded;
    }

该方法在两个地方调用,一个是当本地蓝牙BluetoothAdapter开启后调用,一个就是当远程设备BluetoothDevice的状态发生改变时调用

如下,是在LocalBluetoothProfileManager.java文件中的代码,在蓝牙开启后会调用如下代码读取已配对的设备

 void setBluetoothStateOn() {
        ParcelUuid[] uuids = mLocalAdapter.getUuids();
        if (uuids != null) {
		
            updateLocalProfiles(uuids);
        }
        mEventManager.readPairedDevices();
    }
当远程设备发生改变时会发送ACTION_BOND_STATE_CHANGED的广播,在注册的handler中调用readPairedDevices()方法读取配对设备。监听广播的代码在BluetoothEventManager.java中。

其实,在进行扫描后,获取的设备列表与可配对设备列表缓存在一起,这部分在介绍扫描处介绍

ii>,设备列表加载到屏幕

现在不论是已配对设备或是附近可用设备均缓存在同一列表,所以两个列表的加载类似,附近可用设备列表显示时会有一个progress,所以在构造preferenceGroup对象时有所区别,还有一个区别就是设备的状态,通过底层的BluetoothDevice类中的getBondState()来获取远程设备的配对状态来区分。

设备列表的加载为BluetoothSettings中,已配对设备列表为mPairedDevicesCategory,附近可用设备列表为mAvailableDevicesCategory,均为PreferenceCategory对象,加载时调用的是BluetoothSettings.java中的addDeviceCategory(PreferenceGroup preferenceGroup,int titleId,BluetoothDeviceFilter.Filter filter)方法。

已配对设备设置的过滤器为BluetoothDeviceFilter.BONDED_DEVICE_FILTER

附近可用设备设置的过滤器为Bl

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值