Android-藍芽自動配對與隱藏對話方塊
一、概述
本次分析是基於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許可權,但是這個許可權是系統級應用才有的,所以我們需要對應用進行系統簽名,做成系統應用。
到此,藍芽自動配對與隱藏對話方塊的分析結束。