带你解锁蓝牙skill(三)

转载请注明出处,本文出自fanfan带你解锁蓝牙skill系列
蓝牙这块儿算是系统中的一个大块儿,刚开始分析确实很容易没有头绪,所以在进入庞大的源码之前先确定一个分析顺序,也好避免越学越乱。
对于源码的分析不外乎whw(what—how—why)

对于蓝牙各协议的功能以及如何演示都已经分析完了,具体可以参考
带你解锁蓝牙skill(一)以及带你解锁蓝牙skill(二)。转载请注明出处,本文出自fanfan

本文以Android7.0为例进行源码分析。开始分析源码之前,先来看看蓝牙相关的都有什么东西


4,如何开始

在对一个新事物进行研究之前,我们已经了解了他是什么,那么接下来就是庖丁解牛了。但是目前还做不到目无全牛哈哈。 蓝牙代码实现不外乎包括以下三个方面
  1. 界面UI
    • 设置应用中蓝牙的ui
    • 蓝牙本身这个系统应用中的ui
  2. 蓝牙开关默认值
  3. 协议配置开关:手机是否要支持各种协议
在学之前我们也先要明确目的是什么,即学完蓝牙后我们想要掌握什么样的技能?? 大致如下:
  1. 对于系统开发工作者
    • 掌握基础界面修改及相关逻辑
    • 掌握手机蓝牙开关的系统默认值
    • 掌握蓝牙各协议开关(即禁用/启用蓝牙协议)
    • 掌握如何新增蓝牙协议(更高要求)
  2. 对于应用开发工作者
    • 掌握蓝牙的基本用法:包括开关,扫描,配对,连接等等(毕竟系统应用你并不能决定,你只能是调用各接口)
    • 掌握各蓝牙协议的基本用法(比如实现一个读取联系人的操作)
在确定了研究思路和研究目的之后,我们就可以开始对源码的研究了。

5,蓝牙源码研究

按照第四部分确定的大致方向来进行接下来的研究。不论是蓝牙开关默认值还是协议的开关的值,对这些值还好说,三下五除二就分析好了,但是蓝牙界面仍旧有一个大工程在。从驱动往应用层方向,蓝牙相关的代码位置如下
  1. 第一部分,系统应用设置Settings中的蓝牙相关,显示从设置进入蓝牙的一些界面,代码位置为:packages/apps/Settings/src/com/android/settings/bluetooth/目录结构如下:包括蓝牙开关,蓝牙扫描,蓝牙配对框,蓝牙重命名框,蓝牙选择框等等




  2. 第二部分,系统中有个蓝牙应用Bluetooth,显示界面诸如蓝牙文件传入传出历史记录,蓝牙配对框,蓝牙文件传输框等等,代码位置为:/packages/apps/Bluetooth,Java代码目录结构如下:


    可以看出Bluetooth应用中的代码是按照各协议模块进行区分目录的,但是在各协议模块中并不包含对profile的具体定义,以A2DP为例


    在packages/apps/Bluetooth/src/com/anddroid/bluetooth/a2dp文件夹中只有两个文件A2dpService和A2dpStateMachine,至于这两个文件是干什么,后续会介绍,暂时先了解一个大致的目录结构


  3. 第三部分,就是蓝牙协议的具体实现,代码所在路径:/frameworks/base/packages/SettingsLib/src/com/android/settingslib/bluetooth/

    在该目录下就是一些蓝牙profile的相关的配置了。



  4. 第四部分,集成的一些蓝牙接口:frameworks/base/core/java/android/bluetooth/,目录结构如下:



  5. 可以看到很多在开发过程中常见的类:BluetoothAdapter,BluetoothDevice,BluetoothSocket等等,蓝牙的核心代码和接口的具体实现都在这里!!!


  6. 第五部分,手机开机后启动的蓝牙服务是BluetoothManagerService,代码目录结构为:/frameworks/base/services/core/java/com/android/server/



对蓝牙的应用层的代码接口有了一个大致了解之后,我们开始进行分析

1>,蓝牙界面相关

估计有着急的人会说,看什么界面啊,我就想知道功能是怎么实现的
但我想说,如果没有界面,你如何知道他到底实现了什么功能??
如果没有界面,你该如何下手??

界面大致包括两部分,设置中的蓝牙界面和蓝牙应用中的蓝牙界面

  • 设置中蓝牙相关的界面

    蓝牙界面相关的分析在去年做过,虽然是4.4.2但是原理还是一样的,也没必要再做那么多无用功,贴上博客链接

    蓝牙界面实现分析(一) 蓝牙界面实现分析(二) 蓝牙界面实现分析(三)

    有需要的可以看一下

    在这里需要说明一下:关于已配对设备的各种配置协议显示界面

    蓝牙设备间的连接其实就是各协议之间的连接,蓝牙设备间有可能有多个协议连接,但每个协议仅支持一个连接

    在设备进行配对时,发送设备配对状态发生改变的广播,在监听到广播后设备会去获取到remote设备所支持的协议,并尝试进行连接,比如如果remote设备支持手机音频或者媒体音频,那么本机设备就会尝试该协议的连接。但如果本机设备已经与另一台B远程设备进行了手机音频的连接,那么本机设备会先断开与B设备的连接,去尝试和remote设备进行手机音频的连接。

    也就是说某一个时刻设备某个协议连接只能支持一个远程设备,但是可以支持多个远程设备进行多个协议连接。 设备A在某时刻可以和远程设备B进行媒体音频连接同时保持和远程设备C之间的手机音频连接,如果设备A需要播放媒体音频(比如音乐,视频等)音频会在设备B中进行播放,如果设备A需要进行播放手机音频(即手机通话)会在设备C中进行播放。
  • 蓝牙应用相关界面

    蓝牙应用是为了配合各蓝牙协议而存在的,所以,针对蓝牙应用相关界面会穿插在蓝牙协议的分析中

    蓝牙配对弹出框过程分析讲述了蓝牙配对弹出框的原理。
  • 蓝牙协议开关

  • 蓝牙协议开关这篇文章中讲述了作为系统开发人员如何禁止掉蓝牙某个协议(包括上层和底层)

2>,蓝牙协议实现

对于蓝牙协议我只能是分析常见且我的测试机可以实现的,计划要分析的协议如下

  • opp文件传输协议
  • 互联网协议
  • Hsp手机音频协议
  • A2dp媒体音频协议

也许后续计划会有所改变,先暂时确定这样。


i>,opp协议

以蓝牙传输图片为例,opp文件传输包括文件的传入和传出两方面,分别来考虑

  • 传出文件
  • 传入文件
传出文件




我们就沿着分享图片这一条线去分析,在分享蓝牙图片时,选择蓝牙分享,当然如果蓝牙未开启的话会询问先要开启蓝牙。至于系统分享属于另一个系统的功能,在以后的文章中会介绍。
先介绍一个目前用到的,在选择蓝牙分享后,会启动BluetoothOppLauncherActivity,在该类中的launchDevicePicker()启动DevicePickerActivity,方法如下:


    /**
    如果蓝牙未开启就开启蓝牙,如果蓝牙已开启就启动选择蓝牙设备界面
     * Turns on Bluetooth if not already on, or launches device picker if Bluetooth is on
     * @return
     */
private final void launchDevicePicker() {
        // TODO: In the future, we may send intent to DevicePickerActivity
        // directly,
        // and let DevicePickerActivity to handle Bluetooth Enable.
        if (!BluetoothOppManager.getInstance(this).isEnabled()) {
            if (V) Log.v(TAG, "Prepare Enable BT!! ");
            //如果蓝牙未开启,就去开启蓝牙
            Intent in = new Intent(this, BluetoothOppBtEnableActivity.class);
            in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(in);
        } else {
        //如果蓝牙已开启就启动DevicePickerActiivty,会传入一些参数,这个在以后会用到
            if (V) Log.v(TAG, "BT already enabled!! ");
            Intent in
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值