如何实现android蓝牙开发 自动配对连接,并不弹出提示框

来源:互联网 发布:淘宝推广方式钻石展位 编辑:程序博客网 时间:2024/04/30 08:26

如何实现android蓝牙开发 自动配对连接,并不弹出提示框

0人收藏此文章,我要收藏发表于1个月前(2012-06-19 19:43) ,     已有271次阅读      共0个评论   

之前做一个android版的蓝牙 与血压计通讯的项目,遇到最大的难题就是自动配对.

上网查资料说是用反射createBond()和setPin(),但测试时进行配对还是会出现提示,但配对是成功了

我就开始查找怎么关闭这个蓝牙配对提示框,后面还是伟大的android源码帮助了我。

在源码 BluetoothDevice 类中还有两个隐藏方法

cancelBondProcess()和cancelPairingUserInput()

这两个方法一个是取消配对进程一个是取消用户输入

下面是自动配对的代码

Mainfest,xml注册

view source
print?
1<receiverandroid:name=".BluetoothConnectActivityReceiver">
2    <intent-filter>
3        <actionandroid:name="android.bluetooth.device.action.PAIRING_REQUEST"/>
4    </intent-filter>
5</receiver>

自己在收到广播时处理并将预先输入的密码设置进去

view source
print?
01public class BluetoothConnectActivityReceiver extendsBroadcastReceiver
02{
03 
04    String strPsw ="0";
05 
06    @Override
07    publicvoid 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}

view source
print?
001<b>/************************************ 蓝牙配对函数 * **************/
002import java.lang.reflect.Field;
003import java.lang.reflect.Method;
004 
005import android.bluetooth.BluetoothDevice;
006import android.util.Log;
007public class ClsUtils
008{
009 
010    /**
011     * 与设备配对 参考源码:platform/packages/apps/Settings.git
012     * /Settings/src/com/android/settings/bluetooth/CachedBluetoothDevice.java
013     */
014    staticpublic booleancreateBond(Class btClass, BluetoothDevice btDevice)
015            throwsException
016    {
017        Method createBondMethod = btClass.getMethod("createBond");
018        Boolean returnValue = (Boolean) createBondMethod.invoke(btDevice);
019        returnreturnValue.booleanValue();
020    }
021 
022    /**
023     * 与设备解除配对 参考源码:platform/packages/apps/Settings.git
024     * /Settings/src/com/android/settings/bluetooth/CachedBluetoothDevice.java
025     */
026    staticpublic booleanremoveBond(Class btClass, BluetoothDevice btDevice)
027            throwsException
028    {
029        Method removeBondMethod = btClass.getMethod("removeBond");
030        Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice);
031        returnreturnValue.booleanValue();
032    }
033 
034    staticpublic booleansetPin(Class btClass, BluetoothDevice btDevice,
035            String str)throws Exception
036    {
037        try
038        {
039            Method removeBondMethod = btClass.getDeclaredMethod("setPin",
040                    newClass[]
041                    {byte[].class});
042            Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice,
043                    newObject[]
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        returntrue;
063 
064    }
065 
066    // 取消用户输入
067    staticpublic booleancancelPairingUserInput(Class btClass,
068            BluetoothDevice device)
069 
070    throwsException
071    {
072        Method createBondMethod = btClass.getMethod("cancelPairingUserInput");
073        // cancelBondProcess()
074        Boolean returnValue = (Boolean) createBondMethod.invoke(device);
075        returnreturnValue.booleanValue();
076    }
077 
078    // 取消配对
079    staticpublic booleancancelBondProcess(Class btClass,
080            BluetoothDevice device)
081 
082    throwsException
083    {
084        Method createBondMethod = btClass.getMethod("cancelBondProcess");
085        Boolean returnValue = (Boolean) createBondMethod.invoke(device);
086        returnreturnValue.booleanValue();
087    }
088 
089    /**
090     *
091     * @param clsShow
092     */
093    staticpublic void printAllInform(Class clsShow)
094    {
095        try
096        {
097            // 取得所有方法
098            Method[] hideMethod = clsShow.getMethods();
099            inti = 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>

执行时直接使用:

view source
print?
01<b>publicstatic booleanpair(String strAddr, String strPsw)
02    {
03        booleanresult = 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        returnresult;
60    }</b>