欢迎来到天天文库
浏览记录
ID:12588140
大小:54.86 KB
页数:20页
时间:2018-07-17
《android bluetooth 蓝牙设备之间自动配对》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、AndroidBluetooth学习(3)蓝牙设备之间自动配对0人收藏此文章, 我要收藏发表于6个月前(2013-03-2112:01),已有654次阅读,共0个评论前言(android2.3版本,4.0版本由于是随机获取pin值,没有研究过): 1、蓝牙设备之间自动配对,需要两个设备都安装进行配对的apk(网上好多自动配对的帖子都没有说明情况) 2、在自动匹配的时候想通过反射调用BluetoothDevice的setPin、createBond、cancelPairingUserInput实现设置密钥、配对请求创建、取消
2、密钥信息输入等。 1)createBond()创建,最终会调到源码的BluetoothService的createBond(Stringaddress)方法,通过对源码浅显的了解,createBond主要是写入匹配密钥(BluetoothService的writeDockPin())以及进入jni注册回调函数onCreatePairedDeviceResult观察匹配结果比如: //Pinsdidnotmatch,orremotedevicedidnotrespondtopin //requestintime
3、 //Werejectedpairing,ortheremotesiderejectedpairing.This //happensifeithersidepresses'cancel'atthepairingdialog. //Notsureifthishappens //Otherdeviceisnotrespondingatall //alreadybonded等,在jni中创建了进行匹配的device("CreatePair
4、edDevice"),这时bluetooth会发送一个ACTION_PAIRING_REQUEST的广播,只有当前会出现密钥框的蓝牙设备收到。写完密钥之后,发送广播给另外一个蓝牙设备接收,然后打开密钥输入框进行匹配。 2)setPin()设置密钥,通过查看setting源码,发现在确认输入密钥之后会调用setPin()(如果点取消,就会调用cancelPairingUserInput,取消密钥框),setPin具体通过D-BUS做了什么没有去深究,但是在调用setPin的时候会remove掉一个map里面的键值对(add
5、ress:int),也就是我们在调用setPin之后如果再去调用onCreatePairedDeviceResult,则该方法一定返回false,并且出现下面的打印提示:cancelUserInputNative(B8:FF:FE:55:EF:D6)calledbutnonativedataavailable,ignoring.MaybethePasskeyAgentRequestwasalreadycancelledbytheremoteorbybluez.(因为该方法也会remove掉一个键值对) 3)cance
6、lPairingUserInput()取消用户输入密钥框,个人觉得一般情况下不要和setPin(setPasskey、setPairingConfirmation、setRemoteOutOfBandData)一起用,这几个方法都会remove掉map里面的key:value(也就是互斥的)。 3、蓝牙耳机、手柄等一些无法手动配置的设备是如何完成自动配对的。 在源码里面有一个自动配对的方法,也就是把pin值自动设为“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 }该方法是在底层回调到java层的onRequestPinCode方法时被调用,首先 Checkifitsadock(正常输入的密钥,走正常配对方式,双方输入匹
此文档下载收益归作者所有