Android-蓝牙的网络共享与连接分析
一、概述
本次分析是基于android7.0的源码,主要是介绍如何通过反射来打开蓝牙的网络共享以及互联网的连接。
二、蓝牙的网络共享
1. 网络共享部分源码分析
关于packages/apps/Settings/src/com/android/settings/TetherSettings.java这个路径的代码是展示设置中数据共享的页面,其中包括了usb、蓝牙、wifi,因此打开蓝牙共享的点击事件从这里开始。

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

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

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

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


最后通过监听服务回调调用BluetoothPan中的setBluetoothTetheting()方法,BluetoothPan的实例可以通过监听服务获取,自此打开蓝牙共享网络的源码分析完成。
总结如下:
1) 通过监听服务回调获取BluetoothPan的实例。
2) 反射调用BluetoothPan中的setBluetoothTetheting()方法。
2. 通过反射打开网络共享
1) 通过监听服务回调获取BluetoothPan的实例。

绑定回调监听mBluetoothAdapter.getProfileProxy(this.context, mProfileServiceListener, 5);
2) 反射调用BluetoothPan中的setBluetoothTetheting()方法。 
蓝牙实现自动打开网络共享完成。
三、蓝牙互联网连接
1. 互联网连接部分源码分析
首先我们从点击已配对的蓝牙设备事件出发,一步步了解源码做了什么事情。
关于packages/apps/Settings/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java这个路径的代码是搜索到的蓝牙设备列表展示,里面包含了如何处理蓝牙设备的点击事件。

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

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

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

查看PanProfile下的connect()方法,发现该方法先调用了mService(BluetoothPan类)下的disconnect()方法,再调用了connect()方法。

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

整个连接的源码分析过程完成,做一下总结:
1) 通过监听服务回调获取BluetoothPan的实例。
2) 按照PanProfile.java类中的connect()方法,通过反射先调用BluetoothPan的disconnect方法,再调用connect()方法。
2. 通过反射打开网络共享
1) 通过监听服务回调获取BluetoothPan的实例。

绑定回调监听mBluetoothAdapter.getProfileProxy(this.context, mProfileServiceListener, 5);
2) 先反射获取已连接设备,进行断开,再连接需要连接的设备。

蓝牙设备实现自动连接完成。
Android-蓝牙的网络共享与连接分析的更多相关文章
- VMware vRealize Network Insight 6.2 发布 - 网络和安全可视化分析
发现.优化应用安全性和网络连接解决方案并对其进行故障排除 VMware vRealize Network Insight 可帮助您跨混合和多云环境构建经过优化且高度可用的安全网络基础架构.它提供了网络 ...
- Android KitKat 4.4 Wifi移植AP模式和网络共享的调试日志
Tethering技术在移动平台上已经运用的越来越广泛了.它能够把移动设备当做一个接入点,其它的设备能够通过Wi-Fi.USB或是Bluetooth等方式连接到此移动设备.在Android中能够将Wi ...
- Android 蓝牙开发之搜索、配对、连接、通信大全
蓝牙( Bluetooth®):是一种无线技术标准,可实现固定设备.移动设备和楼宇个人域网之间的短距离数据 交换(使用2.4-2.485GHz的ISM波段的UHF无线电波).蓝牙设备最 ...
- Android系统匿名共享内存Ashmem(Anonymous Shared Memory)在进程间共享的原理分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6666491 在前面一篇文章Android系统匿 ...
- Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面
随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityManager 类,用 ...
- Android编程 获取网络连接状态 及调用网络配置界面
获取网络连接状态 随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityMan ...
- Android编程获取网络连接状态及调用网络配置界面
获取网络连接状态 随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityMan ...
- Android蓝牙BLE开发,扫描、连接、发送和读取信息;
1.BLE开发权限 Android蓝牙BLE开发须打开蓝牙权限和6.0位置权限: <uses-permission android:name="android.permission.B ...
- Android蓝牙A2DP连接实现
代码地址如下:http://www.demodashi.com/demo/14624.html 开发环境: 开发工具:Androidstudio 适配机型:honor8(Android6.0), 坚果 ...
随机推荐
- EIGRP 高级实验
一.环境准备 1. 软件:GNS3 2. 路由:c7200 二.实验操作 实验要求: 1.掌握EIGRP 的不等价均衡的条件. 2.掌握EIGRP 的metric 值修改方法. 3.掌握 EIG ...
- 设计模式-发布订阅模式(javaScript)
1. 前言 2. 什么是发布订阅模式 3. 发布订阅优缺点 4. 举例 4. 总结 1. 前言 发布订阅者模式是为了发布者和订阅者之间避免产生依赖关系,发布订阅者之间的订阅关系由一个中介列表来维护.发 ...
- 补习系列(16)-springboot mongodb 数据库应用技巧
目录 一.关于 MongoDB 二.Spring-Data-Mongo 三.整合 MongoDB CRUD A. 引入框架 B. 数据库配置 C. 数据模型 D. 数据操作 E. 自定义操作 四.高级 ...
- 【swoole】使用swoole简单实现TCP服务
上一篇写到了如何在windows系统上面利用docker快速搭建swoole开发环境,接下来体验下swoole的使用 使用swoole实现tcp服务 <?php $serv = new Swoo ...
- [Android 除錯] Conflict with dependency
Android Studio build 時的錯誤訊息 : Conflict with dependency 詳細錯誤訊息 : Conflict with dependency 'com.androi ...
- Abnormal build process termination--解决IDEA启动web项目报错
iDEA启动后报Error:Abnormal build process terminatio 报错的原因如下: Error:Abnormal build process termination: & ...
- Arduino入门笔记(5):1602液晶实验(实现时钟)
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.Arduino板 https://item.taoba ...
- 微信小程序去除Button默认样式
在小程序开发过程中,使用率蛮高的组件button,因为经常要去除默认样式,然后再自定义样式,所以经常写,自己也总结分享一下简单的实现步骤. (一)实现效果1.实现前(默认样式): 2.实现后(去除默认 ...
- Docker 查看镜像信息
欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 文章首发个人网站: https://ww ...
- 死磕 java集合之LinkedHashSet源码分析
问题 (1)LinkedHashSet的底层使用什么存储元素? (2)LinkedHashSet与HashSet有什么不同? (3)LinkedHashSet是有序的吗? (4)LinkedHashS ...