一、概述
本次分析是基於Android7.0的源碼。
二、自動配對分析過程
首先,我們分析一下源碼的自動配對過程,packages/apps/Settings/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java
當我們在手機的設置中點擊配對某個設備后做了如下事情:
然后我們查看btPreference(BluetoothDevicePreference.java)的onClicked()方法,在同目錄下BluetoothDevicePreference.java中
mCachedDevice是CachedBluetoothDevice.java的實例,它的位置在:frameworks/base/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
最終,執行了藍牙設備的createBond()方法,所以進行自動配對的思路形成。
1)注冊監聽BluetoothDevice.ACTION_FOUND廣播;
2)調用bluetoothAdapter.startDiscovery()方法搜索附近的藍牙設備;
3)當收到廣播后,執行intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)方法獲取藍牙設備實例,篩選出需要配對的設備,然后通過調用BluetoothDevice的createBond()方法完成自動配對;
三、隱藏對話框分析過程
既然要隱藏對話框,那么我們研究一下對話框何時彈出?以及彈出后確認配對做了什么?通過查看源碼發現:package/apps/Settings/src/com/android/settings/bluetooth/BluetoothPairingRequest.java
我們可以看到在這個類中,通過注冊監聽BluetoothDevice.ACTION_PAIRING_REQUEST廣播,當接收到該廣播后啟動對話框。然后我們在查看一下BluetoothPairingDialog類中做了什么?在同目錄下的的BluetoothPairingDialog.java類中:
可以看到,點擊確認后,調用onPair()方法。
之后執行了mDevice.setPairingConfirmation(true),這個方法我們可以通過獲得的藍牙設備實例進行反射調用。
所以,我們的思路就形成了:
1)注冊監聽BluetoothDevice.ACTION_PAIRING_REQUEST廣播,設置高的優先級,接收到廣播后執行abortBroadcast()方法,防止廣播的繼續傳播;
2)接收到廣播后,執行intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)方法獲取藍牙設備實例,然后通過調用BluetoothDevice的setPairingConfirmation(true)設置對話框隱藏;
四、遇到的問題
1)關於setPairingConfirmation(true)方法。
我們查看一下這個方法的源碼frameworks/base/core/android/bluetooth/bluetoothDevice.java
此方法需要BLUETOOTH_PRIVILEGED權限,但是這個權限是系統級應用才有的,所以我們需要對應用進行系統簽名,做成系統應用。
到此,藍牙自動配對與隱藏對話框的分析結束。
2)在API19之前的版本也就是Android4.4,createBond()和setPairingConfirmation(true)方法需要通過反射來調用,在之后的版本可以直接使用。