如何实现android蓝牙开发 自动配对连接,并不弹出提示框
之前做一个android版的蓝牙 与血压计通讯的项目,遇到最大的难题就是自动配对.
上网查资料说是用反射createBond()和setPin(),但测试时进行配对还是会出现提示,但配对是成功了
我就开始查找怎么关闭这个蓝牙配对提示框,后面还是伟大的android源码帮助了我。
在源码 BluetoothDevice 类中还有两个隐藏方法
cancelBondProcess()和cancelPairingUserInput()
这两个方法一个是取消配对进程一个是取消用户输入
下面是自动配对的代码
Mainfest,xml注册
1 | < receiver android:name = ".BluetoothConnectActivityReceiver" > |
2 | < intent-filter > |
3 | < action android:name = "android.bluetooth.device.action.PAIRING_REQUEST" /> |
4 | </ intent-filter > |
5 | </ receiver > |
自己在收到广播时处理并将预先输入的密码设置进去
01 | public class BluetoothConnectActivityReceiver extends BroadcastReceiver |
02 | { |
03 |
04 | String strPsw = "0" ; |
05 |
06 | @Override |
07 | public void onReceive(Context context, Intent intent) |
08 | { |
09 | // TODO Auto-generated method stub |
10 | if (intent.getAction().equals( |
11 | "android.bluetooth.device.action.PAIRING_REQUEST" )) |
12 | { |
13 | BluetoothDevice btDevice = intent |
14 | .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); |
15 |
16 | // byte[] pinBytes = BluetoothDevice.convertPinToBytes("1234"); |
17 | // device.setPin(pinBytes); |
18 | Log.i( "tag11111" , "ddd" ); |
19 | try |
20 | { |
21 | ClsUtils.setPin(btDevice.getClass(), btDevice, strPsw); // 手机和蓝牙采集器配对 |
22 | ClsUtils.createBond(btDevice.getClass(), btDevice); |
23 | ClsUtils.cancelPairingUserInput(btDevice.getClass(), btDevice); |
24 | } |
25 | catch (Exception e) |
26 | { |
27 | // TODO Auto-generated catch block |
28 | e.printStackTrace(); |
29 | } |
30 | } |
31 |
32 |
33 | } |
34 | } |
001 | <b> /************************************ 蓝牙配对函数 * **************/ |
002 | import java.lang.reflect.Field; |
003 | import java.lang.reflect.Method; |
004 |
005 | import android.bluetooth.BluetoothDevice; |
006 | import android.util.Log; |
007 | public class ClsUtils |
008 | { |
009 |
010 | /** |
011 | * 与设备配对 参考源码:platform/packages/apps/Settings.git |
012 | * /Settings/src/com/android/settings/bluetooth/CachedBluetoothDevice.java |
013 | */ |
014 | static public boolean createBond(Class btClass, BluetoothDevice btDevice) |
015 | throws Exception |
016 | { |
017 | Method createBondMethod = btClass.getMethod( "createBond" ); |
018 | Boolean returnValue = (Boolean) createBondMethod.invoke(btDevice); |
019 | return returnValue.booleanValue(); |
020 | } |
021 |
022 | /** |
023 | * 与设备解除配对 参考源码:platform/packages/apps/Settings.git |
024 | * /Settings/src/com/android/settings/bluetooth/CachedBluetoothDevice.java |
025 | */ |
026 | static public boolean removeBond(Class btClass, BluetoothDevice btDevice) |
027 | throws Exception |
028 | { |
029 | Method removeBondMethod = btClass.getMethod( "removeBond" ); |
030 | Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice); |
031 | return returnValue.booleanValue(); |
032 | } |
033 |
034 | static public boolean setPin(Class btClass, BluetoothDevice btDevice, |
035 | String str) throws Exception |
036 | { |
037 | try |
038 | { |
039 | Method removeBondMethod = btClass.getDeclaredMethod( "setPin" , |
040 | new Class[] |
041 | { byte []. class }); |
042 | Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice, |
043 | new Object[] |
044 | {str.getBytes()}); |
045 | Log.e( "returnValue" , "" + returnValue); |
046 | } |
047 | catch (SecurityException e) |
048 | { |
049 | // throw new RuntimeException(e.getMessage()); |
050 | e.printStackTrace(); |
051 | } |
052 | catch (IllegalArgumentException e) |
053 | { |
054 | // throw new RuntimeException(e.getMessage()); |
055 | e.printStackTrace(); |
056 | } |
057 | catch (Exception e) |
058 | { |
059 | // TODO Auto-generated catch block |
060 | e.printStackTrace(); |
061 | } |
062 | return true ; |
063 |
064 | } |
065 |
066 | // 取消用户输入 |
067 | static public boolean cancelPairingUserInput(Class btClass, |
068 | BluetoothDevice device) |
069 |
070 | throws Exception |
071 | { |
072 | Method createBondMethod = btClass.getMethod( "cancelPairingUserInput" ); |
073 | // cancelBondProcess() |
074 | Boolean returnValue = (Boolean) createBondMethod.invoke(device); |
075 | return returnValue.booleanValue(); |
076 | } |
077 |
078 | // 取消配对 |
079 | static public boolean cancelBondProcess(Class btClass, |
080 | BluetoothDevice device) |
081 |
082 | throws Exception |
083 | { |
084 | Method createBondMethod = btClass.getMethod( "cancelBondProcess" ); |
085 | Boolean returnValue = (Boolean) createBondMethod.invoke(device); |
086 | return returnValue.booleanValue(); |
087 | } |
088 |
089 | /** |
090 | * |
091 | * @param clsShow |
092 | */ |
093 | static public void printAllInform(Class clsShow) |
094 | { |
095 | try |
096 | { |
097 | // 取得所有方法 |
098 | Method[] hideMethod = clsShow.getMethods(); |
099 | int i = 0 ; |
100 | for (; i < hideMethod.length; i++) |
101 | { |
102 | Log.e( "method name" , hideMethod[i].getName() + ";and the i is:" |
103 | + i); |
104 | } |
105 | // 取得所有常量 |
106 | Field[] allFields = clsShow.getFields(); |
107 | for (i = 0 ; i < allFields.length; i++) |
108 | { |
109 | Log.e( "Field name" , allFields[i].getName()); |
110 | } |
111 | } |
112 | catch (SecurityException e) |
113 | { |
114 | // throw new RuntimeException(e.getMessage()); |
115 | e.printStackTrace(); |
116 | } |
117 | catch (IllegalArgumentException e) |
118 | { |
119 | // throw new RuntimeException(e.getMessage()); |
120 | e.printStackTrace(); |
121 | } |
122 | catch (Exception e) |
123 | { |
124 | // TODO Auto-generated catch block |
125 | e.printStackTrace(); |
126 | } |
127 | } |
128 | }</b> |
执行时直接使用:
01 | <b> public static boolean pair(String strAddr, String strPsw) |
02 | { |
03 | boolean result = false ; |
04 | BluetoothAdapter bluetoothAdapter = BluetoothAdapter |
05 | .getDefaultAdapter(); |
06 |
07 | bluetoothAdapter.cancelDiscovery(); |
08 |
09 | if (!bluetoothAdapter.isEnabled()) |
10 | { |
11 | bluetoothAdapter.enable(); |
12 | } |
13 |
14 | if (!BluetoothAdapter.checkBluetoothAddress(strAddr)) |
15 | { // 检查蓝牙地址是否有效 |
16 |
17 | Log.d( "mylog" , "devAdd un effient!" ); |
18 | } |
19 |
20 | BluetoothDevice device = bluetoothAdapter.getRemoteDevice(strAddr); |
21 |
22 | if (device.getBondState() != BluetoothDevice.BOND_BONDED) |
23 | { |
24 | try |
25 | { |
26 | Log.d( "mylog" , "NOT BOND_BONDED" ); |
27 | ClsUtils.setPin(device.getClass(), device, strPsw); // 手机和蓝牙采集器配对 |
28 | ClsUtils.createBond(device.getClass(), device); |
29 | remoteDevice = device; // 配对完毕就把这个设备对象传给全局的remoteDevice |
30 | result = true ; |
31 | } |
32 | catch (Exception e) |
33 | { |
34 | // TODO Auto-generated catch block |
35 |
36 | Log.d( "mylog" , "setPiN failed!" ); |
37 | e.printStackTrace(); |
38 | } // |
39 |
40 | } |
41 | else |
42 | { |
43 | Log.d( "mylog" , "HAS BOND_BONDED" ); |
44 | try |
45 | { |
46 | ClsUtils.createBond(device.getClass(), device); |
47 | ClsUtils.setPin(device.getClass(), device, strPsw); // 手机和蓝牙采集器配对 |
48 | ClsUtils.createBond(device.getClass(), device); |
49 | remoteDevice = device; // 如果绑定成功,就直接把这个设备对象传给全局的remoteDevice |
50 | result = true ; |
51 | } |
52 | catch (Exception e) |
53 | { |
54 | // TODO Auto-generated catch block |
55 | Log.d( "mylog" , "setPiN failed!" ); |
56 | e.printStackTrace(); |
57 | } |
58 | } |
59 | return result; |
60 | }</b> |