欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android-蓝牙的网络共享与连接分析

程序员文章站 2022-05-02 12:14:05
一、概述 本次分析是基于android7.0的源码,主要是介绍如何通过反射来打开蓝牙的网络共享以及互联网的连接。 二、蓝牙的网络共享 1. 网络共享部分源码分析 关于packages/apps/Settings/src/com/android/settings/TetherSettings.java ......

一、概述

本次分析是基于android7.0的源码,主要是介绍如何通过反射来打开蓝牙的网络共享以及互联网的连接。

二、蓝牙的网络共享

1. 网络共享部分源码分析

关于packages/apps/settings/src/com/android/settings/tethersettings.java这个路径的代码是展示设置中数据共享的页面,其中包括了usb、蓝牙、wifi,因此打开蓝牙共享的点击事件从这里开始。

Android-蓝牙的网络共享与连接分析

关于点击事件的处理如下:

Android-蓝牙的网络共享与连接分析

发现调用了mcm(connectivitymanager.java类)的starttethering()方法,接下来查看frameworks/base/core/java/android/net/connectivitymanager.java这个类。

Android-蓝牙的网络共享与连接分析

调用了mservice(iconnectivitymanager.aidl)中的starttethering()方法,通过查看源码发现在在connectivityservice.java类中继承了iconnectivitymanager.stub,此类位于:frameworks/base/services/core/java/com/android/server/connectivityservice.java

Android-蓝牙的网络共享与连接分析

接下来调用了mtethering(tethering.java类)的starttethering()方法,此类位于:frameworks/base/services/core/java/com/android/server/connectivity/tethering.java

Android-蓝牙的网络共享与连接分析

Android-蓝牙的网络共享与连接分析 Android-蓝牙的网络共享与连接分析

最后通过监听服务回调调用bluetoothpan中的setbluetoothtetheting()方法,bluetoothpan的实例可以通过监听服务获取,自此打开蓝牙共享网络的源码分析完成。

总结如下:

1) 通过监听服务回调获取bluetoothpan的实例。

2) 反射调用bluetoothpan中的setbluetoothtetheting()方法。

2. 通过反射打开网络共享

1) 通过监听服务回调获取bluetoothpan的实例。  

Android-蓝牙的网络共享与连接分析

绑定回调监听mbluetoothadapter.getprofileproxy(this.context, mprofileservicelistener, 5);

2)  反射调用bluetoothpan中的setbluetoothtetheting()方法。   Android-蓝牙的网络共享与连接分析

蓝牙实现自动打开网络共享完成。

三、蓝牙互联网连接

1. 互联网连接部分源码分析

首先我们从点击已配对的蓝牙设备事件出发,一步步了解源码做了什么事情。
关于packages/apps/settings/src/com/android/settings/bluetooth/devicelistpreferencefragment.java这个路径的代码是搜索到的蓝牙设备列表展示,里面包含了如何处理蓝牙设备的点击事件。

Android-蓝牙的网络共享与连接分析

当点击已绑定设备执行的是connect方法,查看frameworks/base/packages/settingslib/src/com/android/settingslib/bluetooth/cachedbluetoothdevice.java代码。

Android-蓝牙的网络共享与连接分析

在这个java类中继续追寻,发现最后执行如下代码:

Android-蓝牙的网络共享与连接分析

localbluetoothprofile这个类是一个接口类,通过查看源码发现同路径下有mapprofile.java、oppprofile.java、panprofile.java等等类中实现了这个接口,panprofile.java正是我们需要的。

Android-蓝牙的网络共享与连接分析

查看panprofile下的connect()方法,发现该方法先调用了mservice(bluetoothpan类)下的disconnect()方法,再调用了connect()方法。

Android-蓝牙的网络共享与连接分析

并且mservice是可以通过监听服务回调获取到,所以我们可以在上层通过如下方式获取bluetoothpan的实例。

Android-蓝牙的网络共享与连接分析

整个连接的源码分析过程完成,做一下总结:

1) 通过监听服务回调获取bluetoothpan的实例。

2) 按照panprofile.java类中的connect()方法,通过反射先调用bluetoothpan的disconnect方法,再调用connect()方法。

2. 通过反射打开网络共享

1) 通过监听服务回调获取bluetoothpan的实例。

Android-蓝牙的网络共享与连接分析

绑定回调监听mbluetoothadapter.getprofileproxy(this.context, mprofileservicelistener, 5);

2) 先反射获取已连接设备,进行断开,再连接需要连接的设备。

Android-蓝牙的网络共享与连接分析

蓝牙设备实现自动连接完成。

Android-蓝牙的网络共享与连接分析