Android-蓝牙的网络共享与连接分析
一、概述
本次分析是基于android7.0的源碼,主要是介紹如何通過反射來打開藍(lán)牙的網(wǎng)絡(luò)共享以及互聯(lián)網(wǎng)的連接。
二、藍(lán)牙的網(wǎng)絡(luò)共享
1. 網(wǎng)絡(luò)共享部分源碼分析
關(guān)于packages/apps/Settings/src/com/android/settings/TetherSettings.java這個路徑的代碼是展示設(shè)置中數(shù)據(jù)共享的頁面,其中包括了usb、藍(lán)牙、wifi,因此打開藍(lán)牙共享的點擊事件從這里開始。
關(guān)于點擊事件的處理如下:
發(fā)現(xiàn)調(diào)用了mCm(ConnectivityManager.java類)的startTethering()方法,接下來查看frameworks/base/core/java/android/net/ConnectivityManager.java這個類。
調(diào)用了mService(IConnectivityManager.aidl)中的startTethering()方法,通過查看源碼發(fā)現(xiàn)在在ConnectivityService.java類中繼承了IConnectivityManager.stub,此類位于:frameworks/base/services/core/java/com/android/server/ConnectivityService.java
接下來調(diào)用了mTethering(Tethering.java類)的startTethering()方法,此類位于:frameworks/base/services/core/java/com/android/server/connectivity/Tethering.java
最后通過監(jiān)聽服務(wù)回調(diào)調(diào)用BluetoothPan中的setBluetoothTetheting()方法,BluetoothPan的實例可以通過監(jiān)聽服務(wù)獲取,自此打開藍(lán)牙共享網(wǎng)絡(luò)的源碼分析完成。
總結(jié)如下:
1) 通過監(jiān)聽服務(wù)回調(diào)獲取BluetoothPan的實例。
2) 反射調(diào)用BluetoothPan中的setBluetoothTetheting()方法。
2. 通過反射打開網(wǎng)絡(luò)共享
1)通過監(jiān)聽服務(wù)回調(diào)獲取BluetoothPan的實例。
綁定回調(diào)監(jiān)聽mBluetoothAdapter.getProfileProxy(this.context, mProfileServiceListener, 5);
2)反射調(diào)用BluetoothPan中的setBluetoothTetheting()方法?! ?/p>
藍(lán)牙實現(xiàn)自動打開網(wǎng)絡(luò)共享完成。
三、藍(lán)牙互聯(lián)網(wǎng)連接
1. 互聯(lián)網(wǎng)連接部分源碼分析
首先我們從點擊已配對的藍(lán)牙設(shè)備事件出發(fā),一步步了解源碼做了什么事情。
關(guān)于packages/apps/Settings/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java這個路徑的代碼是搜索到的藍(lán)牙設(shè)備列表展示,里面包含了如何處理藍(lán)牙設(shè)備的點擊事件。
當(dāng)點擊已綁定設(shè)備執(zhí)行的是connect方法,查看frameworks/base/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java代碼。
在這個java類中繼續(xù)追尋,發(fā)現(xiàn)最后執(zhí)行如下代碼:
LocalBluetoothProfile這個類是一個接口類,通過查看源碼發(fā)現(xiàn)同路徑下有MapProfile.java、OppProfile.java、PanProfile.java等等類中實現(xiàn)了這個接口,PanProfile.java正是我們需要的。
查看PanProfile下的connect()方法,發(fā)現(xiàn)該方法先調(diào)用了mService(BluetoothPan類)下的disconnect()方法,再調(diào)用了connect()方法。
并且mService是可以通過監(jiān)聽服務(wù)回調(diào)獲取到,所以我們可以在上層通過如下方式獲取BluetoothPan的實例。
整個連接的源碼分析過程完成,做一下總結(jié):
1) 通過監(jiān)聽服務(wù)回調(diào)獲取BluetoothPan的實例。
2) 按照PanProfile.java類中的connect()方法,通過反射先調(diào)用BluetoothPan的disconnect方法,再調(diào)用connect()方法。
2. 通過反射打開網(wǎng)絡(luò)共享
1) 通過監(jiān)聽服務(wù)回調(diào)獲取BluetoothPan的實例。
綁定回調(diào)監(jiān)聽mBluetoothAdapter.getProfileProxy(this.context, mProfileServiceListener, 5);
2) 先反射獲取已連接設(shè)備,進(jìn)行斷開,再連接需要連接的設(shè)備。
藍(lán)牙設(shè)備實現(xiàn)自動連接完成。
總結(jié)
以上是生活随笔為你收集整理的Android-蓝牙的网络共享与连接分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: excel中如何用函数嵌套提取单元格中中
- 下一篇: 如何一次性去除excel表中全半角空格(