一、概述 本次分析是基於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,因此打開藍牙共用的點擊事件從這裡開始。
關於點擊事件的處理如下:
發現調用了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) 先反射獲取已連接設備,進行斷開,再連接需要連接的設備。
藍牙設備實現自動連接完成。