前言(android2.3版本,4.0版本由于是随機擷取pin值,沒有研究過):
1、藍牙裝置之間自動配對,需要兩個裝置都安裝進行配對的apk(網上好多自動配對的文章都沒有說明情況)
2、在自動比對的時候想通過反射調用BluetoothDevice的setPin、createBond、cancelPairingUserInput實作設定密鑰、配對請求建立、取消密鑰資訊輸入等。
1)createBond()建立,最終會調到源碼的BluetoothService的createBond(String address)方法,通過對源碼淺顯的了解,createBond主要是寫入比對密鑰(BluetoothService的writeDockPin())以及進入jni注冊回調函數onCreatePairedDeviceResult觀察比對結果
比如: // Pins did not match, or remote device did not respond to pin
// request in time
// We rejected pairing, or the remote side rejected pairing. This
// happens if either side presses 'cancel' at the pairing dialog.
// Not sure if this happens
// Other device is not responding at all
// already bonded
等,在jni中建立了進行比對的device("CreatePairedDevice"),這時bluetooth會發送一個ACTION_PAIRING_REQUEST的廣播,隻有目前會出現密鑰框的藍牙裝置收到。寫完密鑰之後,發送廣播給另外一個藍牙裝置接收,然後打開密鑰輸入框進行比對。
2)setPin()設定密鑰,通過檢視setting源碼,發現在确認輸入密鑰之後會調用setPin()(如果點取消,就會調用cancelPairingUserInput,取消密鑰框),setPin具體通過D-BUS做了什麼沒有去深究,但是在調用setPin的時候會remove掉一個map裡面的鍵值對(address:int),也就是我們在調用setPin之後如果再去調用onCreatePairedDeviceResult,則該方法一定傳回false,并且出現下面的列印提示:cancelUserInputNative(B8:FF:FE:55:EF:D6) called but no native data available, ignoring. Maybe the PasskeyAgent Request was already cancelled by the remote or by bluez.(因為該方法也會remove掉一個鍵值對)
3)cancelPairingUserInput()取消使用者輸入密鑰框,個人覺得一般情況下不要和setPin(setPasskey、setPairingConfirmation、setRemoteOutOfBandData)一起用,這幾個方法都會remove掉map裡面的key:value(也就是互斥的

)。
3、藍牙耳機、搖桿等一些無法手動配置的裝置是如何完成自動配對的。
在源碼裡面有一個自動配對的方法,也就是把pin值自動設為“0000”
?
1 2 3 4 5 6 7 8 9 | |
該方法是在底層回調到java層的onRequestPinCode方法時被調用,首先 Check if its a dock(正常輸入的密鑰,走正常配對方式,雙方輸入比對值),然後再 try 0000 once if the device looks dumb(涉及到Device.AUDIO_VIDEO相關部分如:耳機,免提等進入自動比對模式)進行自動配對。
言歸正傳,雖然個人覺得自動配對需要雙方乃至多方藍牙裝置都需要裝上實作自動配對的apk,已經失去了自動配對的意義,但有可能還是會派上用場。下面我們看看現實情況的自動配對是什麼樣的吧。
由于BluetoothDevice配對的方法都是hide的,是以我們需要通過反射調用被隐藏的方法,現在基本都是通用的工具類型了,網上模式基本一樣。
ClsUtils.java
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | |
Bluetooth1.java 主activity,所有界面操作實作地方
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 | |
PairingRequest.java (重要部分,自動配對主要是這個部分完成,activity隻是建立了一個配對請求)
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | |
AndroidManifest.xml 啟動activity,接收廣播
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | |
main.xml 布局
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | |
我覺得想要真正意義上的完成藍牙裝置的自動配對,方法還是有的,需要研究一下setting部分的Bluetooth子產品,以及根據藍牙源碼進行深入了解,期待着關于android bluetooth深入淺出的文章,大家有什麼好的文章,留個言大家一起好好學習學習。