Android Bluetooth 蓝牙设备之间自动配对.docx
- 文档编号:17599773
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:37
- 大小:30.35KB
Android Bluetooth 蓝牙设备之间自动配对.docx
《Android Bluetooth 蓝牙设备之间自动配对.docx》由会员分享,可在线阅读,更多相关《Android Bluetooth 蓝牙设备之间自动配对.docx(37页珍藏版)》请在冰点文库上搜索。
AndroidBluetooth蓝牙设备之间自动配对
AndroidBluetooth学习(3)蓝牙设备之间自动配对
0人收藏此文章, 我要收藏发表于6个月前(2013-03-2112:
01),已有654次阅读,共0个评论
前言(android2.3版本,4.0版本由于是随机获取pin值,没有研究过):
1、蓝牙设备之间自动配对,需要两个设备都安装进行配对的apk(网上好多自动配对的帖子都没有说明情况)
2、在自动匹配的时候想通过反射调用BluetoothDevice的setPin、createBond、cancelPairingUserInput实现设置密钥、配对请求创建、取消密钥信息输入等。
1)createBond()创建,最终会调到源码的BluetoothService的createBond(Stringaddress)方法,通过对源码浅显的了解,createBond主要是写入匹配密钥(BluetoothService的writeDockPin())以及进入jni注册回调函数onCreatePairedDeviceResult观察匹配结果
比如:
//Pinsdidnotmatch,orremotedevicedidnotrespondtopin
//requestintime
//Werejectedpairing,ortheremotesiderejectedpairing.This
//happensifeithersidepresses'cancel'atthepairingdialog.
//Notsureifthishappens
//Otherdeviceisnotrespondingatall
//alreadybonded
等,在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)calledbutnonativedataavailable,ignoring.MaybethePasskeyAgentRequestwasalreadycancelledbytheremoteorbybluez.(因为该方法也会remove掉一个键值对)
3)cancelPairingUserInput()取消用户输入密钥框,个人觉得一般情况下不要和setPin(setPasskey、setPairingConfirmation、setRemoteOutOfBandData)一起用,这几个方法都会remove掉map里面的key:
value(也就是互斥的
)。
3、蓝牙耳机、手柄等一些无法手动配置的设备是如何完成自动配对的。
在源码里面有一个自动配对的方法,也就是把pin值自动设为“0000”
1
/*package*/ synchronizedbooleanattemptAutoPair(Stringaddress){
2
if (!
mBondState.hasAutoPairingFailed(address)&&
3
!
mBondState.isAutoPairingBlacklisted(address)){
4
mBondState.attempt(address);
5
setPin(address,BluetoothDevice.convertPinToBytes("0000"));
6
return true;
7
}
8
return false;
9
}
该方法是在底层回调到java层的onRequestPinCode方法时被调用,首先 Checkifitsadock(正常输入的密钥,走正常配对方式,双方输入匹配值),然后再 try0000onceifthedevicelooksdumb(涉及到Device.AUDIO_VIDEO相关部分如:
耳机,免提等进入自动匹配模式)进行自动配对。
言归正传,虽然个人觉得自动配对需要双方乃至多方蓝牙设备都需要装上实现自动配对的apk,已经失去了自动配对的意义,但有可能还是会派上用场。
下面我们看看现实情况的自动配对是什么样的吧。
由于BluetoothDevice配对的方法都是hide的,所以我们需要通过反射调用被隐藏的方法,现在基本都是通用的工具类型了,网上模式基本一样。
ClsUtils.java
001
package cn.bluetooth;
002
003
import java.lang.reflect.Field;
004
import java.lang.reflect.Method;
005
import android.bluetooth.BluetoothAdapter;
006
import android.bluetooth.BluetoothDevice;
007
import android.util.Log;
008
public class ClsUtils
009
{
010
public static BluetoothDeviceremoteDevice=null;
011
/**
012
*与设备配对参考源码:
platform/packages/apps/Settings.git
013
*/Settings/src/com/android/settings/bluetooth/CachedBluetoothDevice.java
014
*/
015
@SuppressWarnings("unchecked")
016
static public boolean createBond(@SuppressWarnings("rawtypes")ClassbtClass,BluetoothDevicebtDevice)
017
throws Exception
018
{
019
MethodcreateBondMethod=btClass.getMethod("createBond");
020
BooleanreturnValue=(Boolean)createBondMethod.invoke(btDevice);
021
return returnValue.booleanValue();
022
}
023
024
/**
025
*与设备解除配对参考源码:
platform/packages/apps/Settings.git
026
*/Settings/src/com/android/settings/bluetooth/CachedBluetoothDevice.java
027
*/
028
@SuppressWarnings("unchecked")
029
static public boolean removeBond(ClassbtClass,BluetoothDevicebtDevice)
030
throws Exception
031
{
032
MethodremoveBondMethod=btClass.getMethod("removeBond");
033
BooleanreturnValue=(Boolean)removeBondMethod.invoke(btDevice);
034
return returnValue.booleanValue();
035
}
036
037
@SuppressWarnings("unchecked")
038
static public boolean setPin(ClassbtClass,BluetoothDevicebtDevice,
039
Stringstr) throws Exception
040
{
041
try
042
{
043
MethodremoveBondMethod=btClass.getDeclaredMethod("setPin",
044
new Class[]
045
{byte[].class});
046
BooleanreturnValue=(Boolean)removeBondMethod.invoke(btDevice,
047
new Object[]
048
{str.getBytes()});
049
Log.d("returnValue", "setPinissuccess" +btDevice.getAddress()+returnValue.booleanValue());
050
}
051
catch (SecurityExceptione)
052
{
053
//thrownewRuntimeException(e.getMessage());
054
e.printStackTrace();
055
}
056
catch (IllegalArgumentExceptione)
057
{
058
//thrownewRuntimeException(e.getMessage());
059
e.printStackTrace();
060
}
061
catch (Exceptione)
062
{
063
//TODOAuto-generatedcatchblock
064
e.printStackTrace();
065
}
066
return true;
067
068
}
069
070
//取消用户输入
071
@SuppressWarnings("unchecked")
072
static public boolean cancelPairingUserInput(ClassbtClass,
073
BluetoothDevicedevice)
074
075
throws Exception
076
{
077
MethodcreateBondMethod=btClass.getMethod("cancelPairingUserInput");
078
//cancelBondProcess()
079
BooleanreturnValue=(Boolean)createBondMethod.invoke(device);
080
Log.d("returnValue", "cancelPairingUserInputissuccess" +returnValue.booleanValue());
081
return returnValue.booleanValue();
082
}
083
084
//取消配对
085
@SuppressWarnings("unchecked")
086
static public boolean cancelBondProcess(ClassbtClass,
087
BluetoothDevicedevice)
088
089
throws Exception
090
{
091
MethodcreateBondMethod=btClass.getMethod("cancelBondProcess");
092
BooleanreturnValue=(Boolean)createBondMethod.invoke(device);
093
return returnValue.booleanValue();
094
}
095
096
/**
097
*
098
*@paramclsShow
099
*/
100
@SuppressWarnings("unchecked")
101
static public void printAllInform(ClassclsShow)
102
{
103
try
104
{
105
//取得所有方法
106
Method[]hideMethod=clsShow.getMethods();
107
int i= 0;
108
for (;i 109 { 110 //Log.e("methodname",hideMethod.getName()+";andtheiis: " 111 // +i); 112 } 113 //取得所有常量 114 Field[]allFields=clsShow.getFields(); 115 for (i= 0;i 116 { 117 //Log.e("Fieldname",allFields.getName()); 118 } 119 } 120 catch (SecurityExceptione) 121 { 122 //thrownewRuntimeException(e.getMessage()); 123 e.printStackTrace(); 124 } 125 catch (IllegalArgumentExceptione) 126 { 127 //thrownewRuntimeException(e.getMessage()); 128 e.printStackTrace(); 129 } 130 catch (Exceptione) 131 { 132 //TODOAuto-generatedcatchblock 133 e.printStackTrace(); 134 } 135 } 136 } Bluetooth1.java 主activity,所有界面操作实现地方 001 package cn.bluetooth; 002 import java.io.IOException; 003 import java.util.ArrayList; 004 import java.util.List; 005 006 import android.app.Activity; 007 import android.bluetooth.BluetoothAdapter; 008 import android.bluetooth.BluetoothDevice; 009 import android.bluetooth.BluetoothSocket; 010 import android.content.BroadcastReceiver; 011 import android.content.Context; 012 import android.content.Intent; 013 import android.content.IntentFilter; 014 import android.os.Bundle; 015 import android.util.Log; 016 import android.view.Menu; 017 import android.view.View; 018 import android.widget.AdapterView; 019 import android.widget.ArrayAdapter; 020 import android.widget.Button; 021 import android.widget.ListView; 022 import android.widget.Toast; 023 import android.widget.ToggleButton; 024 public class Bluetooth1 extends Activity{ 025 /**Calledwhentheactivityisfirstcreated.*/ 026 ButtonbtnSearch,btnDis,btnExit; 027 ToggleButtontbtnSwitch; 028 ListViewlvBTDevices; 029 ArrayAdapter 030 List 031 BluetoothAdapterbtAdapt; 032 public static BluetoothSocketbtSocket; 033 @Override 034 public void onCreate(BundlesavedInstanceState){
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android Bluetooth 蓝牙设备之间自动配对 蓝牙 设备 之间 自动 配对