上网查资料说是用反射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> |
本文详细介绍了如何使用反射API实现蓝牙设备的自动配对与解除配对过程,包括设置PIN码、创建连接、取消用户输入及配对进程等关键步骤,并通过源码分析提供了实际操作代码。
9229

被折叠的 条评论
为什么被折叠?



