資源描述:
《android bluetooth 藍(lán)牙設(shè)備之間自動(dòng)配對(duì)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、AndroidBluetooth學(xué)習(xí)(3)藍(lán)牙設(shè)備之間自動(dòng)配對(duì)0人收藏此文章,?我要收藏發(fā)表于6個(gè)月前(2013-03-2112:01),已有654次閱讀,共0個(gè)評(píng)論前言(android2.3版本,4.0版本由于是隨機(jī)獲取pin值,沒有研究過):???1、藍(lán)牙設(shè)備之間自動(dòng)配對(duì),需要兩個(gè)設(shè)備都安裝進(jìn)行配對(duì)的apk(網(wǎng)上好多自動(dòng)配對(duì)的帖子都沒有說明情況)???2、在自動(dòng)匹配的時(shí)候想通過反射調(diào)用BluetoothDevice的setPin、createBond、cancelPairingUserInput實(shí)現(xiàn)設(shè)置密鑰、配對(duì)請(qǐng)求創(chuàng)建、取消
2、密鑰信息輸入等。??????1)createBond()創(chuàng)建,最終會(huì)調(diào)到源碼的BluetoothService的createBond(Stringaddress)方法,通過對(duì)源碼淺顯的了解,createBond主要是寫入匹配密鑰(BluetoothService的writeDockPin())以及進(jìn)入jni注冊(cè)回調(diào)函數(shù)onCreatePairedDeviceResult觀察匹配結(jié)果比如:??//Pinsdidnotmatch,orremotedevicedidnotrespondtopin??????//requestintime
3、????????????//Werejectedpairing,ortheremotesiderejectedpairing.This??????//happensifeithersidepresses'cancel'atthepairingdialog.????????????//Notsureifthishappens?????????????//Otherdeviceisnotrespondingatall????????????//alreadybonded等,在jni中創(chuàng)建了進(jìn)行匹配的device("CreatePair
4、edDevice"),這時(shí)bluetooth會(huì)發(fā)送一個(gè)ACTION_PAIRING_REQUEST的廣播,只有當(dāng)前會(huì)出現(xiàn)密鑰框的藍(lán)牙設(shè)備收到。寫完密鑰之后,發(fā)送廣播給另外一個(gè)藍(lán)牙設(shè)備接收,然后打開密鑰輸入框進(jìn)行匹配。??????2)setPin()設(shè)置密鑰,通過查看setting源碼,發(fā)現(xiàn)在確認(rèn)輸入密鑰之后會(huì)調(diào)用setPin()(如果點(diǎn)取消,就會(huì)調(diào)用cancelPairingUserInput,取消密鑰框),setPin具體通過D-BUS做了什么沒有去深究,但是在調(diào)用setPin的時(shí)候會(huì)remove掉一個(gè)map里面的鍵值對(duì)(add
5、ress:int),也就是我們?cè)谡{(diào)用setPin之后如果再去調(diào)用onCreatePairedDeviceResult,則該方法一定返回false,并且出現(xiàn)下面的打印提示:cancelUserInputNative(B8:FF:FE:55:EF:D6)calledbutnonativedataavailable,ignoring.MaybethePasskeyAgentRequestwasalreadycancelledbytheremoteorbybluez.(因?yàn)樵摲椒ㄒ矔?huì)remove掉一個(gè)鍵值對(duì))????????3)cance
6、lPairingUserInput()取消用戶輸入密鑰框,個(gè)人覺得一般情況下不要和setPin(setPasskey、setPairingConfirmation、setRemoteOutOfBandData)一起用,這幾個(gè)方法都會(huì)remove掉map里面的key:value(也就是互斥的)。???3、藍(lán)牙耳機(jī)、手柄等一些無法手動(dòng)配置的設(shè)備是如何完成自動(dòng)配對(duì)的。???在源碼里面有一個(gè)自動(dòng)配對(duì)的方法,也就是把pin值自動(dòng)設(shè)為“0000”????1/*package*/?synchronizedbooleanattemptAutoPa
7、ir(Stringaddress){2????????if?(!mBondState.hasAutoPairingFailed(address)&&3????????????????!mBondState.isAutoPairingBlacklisted(address)){4????????????mBondState.attempt(address);5????????????setPin(address,BluetoothDevice.convertPinToBytes("0000"));6????????????retur
8、n?true;7????????}8????????return?false;9????}該方法是在底層回調(diào)到j(luò)ava層的onRequestPinCode方法時(shí)被調(diào)用,首先?Checkifitsadock(正常輸入的密鑰,走正常配對(duì)方式,雙方輸入匹