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權限,但是這個權限是系統級應用才有的,所以我們需要對應用進行系統簽名,做成系統應用。

到此,藍牙自動配對與隱藏對話框的分析結束。

2)在API19之前的版本也就是Android4.4,createBond()和setPairingConfirmation(true)方法需要通過反射來調用,在之后的版本可以直接使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM