android -- 蓝牙 bluetooth

本文详细介绍了Android系统中蓝牙模块的代码分布与结构,包括蓝牙应用、设置界面、协议栈等关键部分的位置与功能,并概述了蓝牙设置界面的主要代码组件。

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

推荐个源码在线阅读网址 http://androidxref.com/


各个蓝牙的存在地方:
packages/apps/Bluetooth/ 
packages/apps/Bluetooth/src/com/android/bluetooth/btservice--

---看这路径肯定是蓝牙应用方面的代码了,主要是关于蓝牙应用协议的表现代码,包括opp、hfp、hdp、a2dp、pan等等,这些名词后面再解释。
/packages/apps/Settings/src/com/android/settings/bluetooth
---设置界面选项的蓝牙设置界面代码:
BluetoothPairingDialog.java --蓝牙匹配对话框
BluetoothSettings.java --设置界面,用于管理配对和连接设备
BluetoothEnabler.java --界面上蓝牙开启关闭
BluetoothDiscoverableEnabler.java --
frameworks/base/core/Java/android/server/  

  4.2以后这个目录虽然还有了,但里面代码已经转移到应用层了,就是前面那个目录,所以4.2.2上的蓝牙这里可以忽略。
framework/base/core/java/android/bluetooth  
           这个目录里的代码更像一个桥梁,里面有供java层使用一些类,也有对应的aidl文件联系C、C++部分的代码,还是挺重要的。
kernel\drivers\bluetoothBluetooth    
           具体协议实现。包括hci,hid,rfcomm,sco,SDP等协议
kernel\net\bluetooth Linux kernel
           对各种接口的Bluetoothdevice的驱动。例如:USB接口,串口等,上面kernel这两个目录有可能看不到的,但一定会有的。
external\bluetooth\bluedroid      BlueZ (应用空间协议),官方蓝牙协议栈。
system\bluetoothBluetooth        适配层代码,和framework那个作用类似,是串联framework与blueZ的工具。

        大致代码分布就是这些,初步查看后让我们再来看下蓝牙的整体结构。


设置界面选项的蓝牙设置界面代码:
BluetoothEnabler.java --界面上蓝牙开启关闭
---BluetoothEnabler is a helper to manage the Bluetooth on/off checkbox preference. It turns on/off Bluetooth and ensures 
---the summary of the preference reflects the current state.
BluetoothSettings.java--设置界面,用于管理配对和连接设备

---BluetoothSettings is the Settings screen for Bluetooth configuration and connection management.--


蓝牙布局结构

public final class BluetoothSettings extends DeviceListPreferenceFragment implements Indexable {
    private static final String TAG = "BluetoothSettings";
......
    @Override
    void addPreferencesForActivity() {
        addPreferencesFromResource(R.xml.bluetooth_settings);

        mPairedDevicesCategory = new PreferenceCategory(getPrefContext());
        mPairedDevicesCategory.setKey(KEY_PAIRED_DEVICES);
        mPairedDevicesCategory.setOrder(1);
        getPreferenceScreen().addPreference(mPairedDevicesCategory);

        mAvailableDevicesCategory = new BluetoothProgressCategory(getActivity());
        mAvailableDevicesCategory.setSelectable(false);
        mAvailableDevicesCategory.setOrder(2);
        getPreferenceScreen().addPreference(mAvailableDevicesCategory);

        mMyDevicePreference = new Preference(getPrefContext());
        mMyDevicePreference.setSelectable(false);
        mMyDevicePreference.setOrder(3);
        getPreferenceScreen().addPreference(mMyDevicePreference);

        setHasOptionsMenu(true);
    }
BluetoothSettings属于PreferenceFragment,需要加载布局文件bluetooth_settings.xml(/packages/apps/Settings/res/xml/bluetooth.xml).
以下是布局文件代码,总共四行。节点为PreferenceScreen,代表整个显示屏幕,内部可以嵌套不同的标签,在这里,内部没有任何标签,
是在代码中动态添加不同种类的布局
//packages/apps/Settings/res/xml/bluetooth.xml
<?xml version="1.0" encoding="utf-8"?>
......
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:title="@string/bluetooth_settings" >

</PreferenceScreen>
备注:
xmlns:android="http://schemas.android.com/apk/res/android
    --声明xml命名空间,xmlns意思为“xml namespace”.冒号后面是给这个引用起的别名。

----schemas是xml文档的两种约束文件其中的一种,规定了xml中有哪些元素(标签)、元素有哪些属性及各元素的关系。
从面向对象的角度理解schemas文件可以认为它是被约束的xml文档的“类”或称为“模板”。
----早期或简单的xml用的是另一种约束,称为DTD,这东西大家天天都见到。html/xhtml中都存在(早期的html可能没有),如
"<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"。
现在大部分xml文档的约束都换成schema了,原因是schema本身也是xml,二schema扩展性强。

xml补充:
------/packages/apps/Settings/src/com/android/settings/bluetooth
./DevicePickerFragment.java:54:        addPreferencesFromResource(R.xml.device_picker);
./BluetoothSettings.java:162:        addPreferencesFromResource(R.xml.bluetooth_settings);

整体结构

图中把JNI部分虽然在目前4.2的代码中在packages层,这里还是画在Framework层了,说明下,不要引起理解的误会


PS:上图关于蓝牙协议栈的说明有误,4.2里已经不再是bluez了,在些更正一下,当然协议栈这一部分还是要有的,新的协议栈看下面英文:
Android 4.2 introduces a new Bluetooth stack optimized for use with Android devices. The new Bluetooth stack developed in 
collaboration between Google and Broadcom replaces the stack based on BlueZ and provides improved compatibility and reliability.
google和broadcom合作开发了一个新蓝牙协议栈,老版本的兼容性问题在所难免了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值