• 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) 先反射获取已连接设备,进行断开,再连接需要连接的设备。

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

  • 相关阅读:
    Git和SVN之间的五个基本区别
    如何成为一名程序员:我的道路
    产品经理要懂多少技术?
    Unix哲学相关资源汇总
    Android.mk简介
    Android 中的 Service 全面总结
    获取Map集合中数据的方法
    少编码多思考:代码越多 问题越多
    【自定义Android带图片和文字的ImageButton】
    Android task process thread 进程与线程
  • 原文地址:https://www.cnblogs.com/doubleWin/p/10299397.html
Copyright © 2020-2023  润新知