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


    之前做一个android版的蓝牙 与血压计通讯的项目,遇到最大的难题就是自动配对.
    
    上网查资料说是用反射createBond()和setPin(),但测试时进行配对还是会出现提示,但配对是成功了
    
    我就开始查找怎么关闭这个蓝牙配对提示框,后面还是伟大的android源码帮助了我。
    
    在源码 BluetoothDevice 类中还有两个隐藏方法
    
    cancelBondProcess()和cancelPairingUserInput()
    
    这两个方法一个是取消配对进程一个是取消用户输入
    
    下面是自动配对的代码
    
    Mainfest,xml注册
    
     
    <receiver android:name=".BluetoothConnectActivityReceiver" >
        <intent-filter>
            <action android:name="android.bluetooth.device.action.PAIRING_REQUEST" />
        </intent-filter>
    </receiver>
    自己在收到广播时处理并将预先输入的密码设置进去
    
    
    public class BluetoothConnectActivityReceiver extends BroadcastReceiver
    {
     
        String strPsw = "0";
     
        @Override
        public void onReceive(Context context, Intent intent)
        {
            // TODO Auto-generated method stub
            if (intent.getAction().equals(
                    "android.bluetooth.device.action.PAIRING_REQUEST"))
            {
                BluetoothDevice btDevice = intent
                        .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
     
                // byte[] pinBytes = BluetoothDevice.convertPinToBytes("1234");
                // device.setPin(pinBytes);
                Log.i("tag11111", "ddd");
                try
                {
                    ClsUtils.setPin(btDevice.getClass(), btDevice, strPsw); // 手机和蓝牙采集器配对
                    ClsUtils.createBond(btDevice.getClass(), btDevice);
                    ClsUtils.cancelPairingUserInput(btDevice.getClass(), btDevice);
                }
                catch (Exception e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
     
     
        }
    }
     
    
    /************************************ 蓝牙配对函数 * **************/
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
     
    import android.bluetooth.BluetoothDevice;
    import android.util.Log;
    public class ClsUtils
    {
     
        /**
         * 与设备配对 参考源码:platform/packages/apps/Settings.git
         * /Settings/src/com/android/settings/bluetooth/CachedBluetoothDevice.java
         */
        static public boolean createBond(Class btClass, BluetoothDevice btDevice)
                throws Exception
        {
            Method createBondMethod = btClass.getMethod("createBond");
            Boolean returnValue = (Boolean) createBondMethod.invoke(btDevice);
            return returnValue.booleanValue();
        }
     
        /**
         * 与设备解除配对 参考源码:platform/packages/apps/Settings.git
         * /Settings/src/com/android/settings/bluetooth/CachedBluetoothDevice.java
         */
        static public boolean removeBond(Class btClass, BluetoothDevice btDevice)
                throws Exception
        {
            Method removeBondMethod = btClass.getMethod("removeBond");
            Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice);
            return returnValue.booleanValue();
        }
     
        static public boolean setPin(Class btClass, BluetoothDevice btDevice,
                String str) throws Exception
        {
            try
            {
                Method removeBondMethod = btClass.getDeclaredMethod("setPin",
                        new Class[]
                        {byte[].class});
                Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice,
                        new Object[]
                        {str.getBytes()});
                Log.e("returnValue", "" + returnValue);
            }
            catch (SecurityException e)
            {
                // throw new RuntimeException(e.getMessage());
                e.printStackTrace();
            }
            catch (IllegalArgumentException e)
            {
                // throw new RuntimeException(e.getMessage());
                e.printStackTrace();
            }
            catch (Exception e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return true;
     
        }
     
        // 取消用户输入
        static public boolean cancelPairingUserInput(Class btClass,
                BluetoothDevice device)
     
        throws Exception
        {
            Method createBondMethod = btClass.getMethod("cancelPairingUserInput");
            // cancelBondProcess()
            Boolean returnValue = (Boolean) createBondMethod.invoke(device);
            return returnValue.booleanValue();
        }
     
        // 取消配对
        static public boolean cancelBondProcess(Class btClass,
                BluetoothDevice device)
     
        throws Exception
        {
            Method createBondMethod = btClass.getMethod("cancelBondProcess");
            Boolean returnValue = (Boolean) createBondMethod.invoke(device);
            return returnValue.booleanValue();
        }
     
        /**
         * 
         * @param clsShow
         */
        static public void printAllInform(Class clsShow)
        {
            try
            {
                // 取得所有方法
                Method[] hideMethod = clsShow.getMethods();
                int i = 0;
                for (; i < hideMethod.length; i++)
                {
                    Log.e("method name", hideMethod[i].getName() + ";and the i is:"
                            + i);
                }
                // 取得所有常量
                Field[] allFields = clsShow.getFields();
                for (i = 0; i < allFields.length; i++)
                {
                    Log.e("Field name", allFields[i].getName());
                }
            }
            catch (SecurityException e)
            {
                // throw new RuntimeException(e.getMessage());
                e.printStackTrace();
            }
            catch (IllegalArgumentException e)
            {
                // throw new RuntimeException(e.getMessage());
                e.printStackTrace();
            }
            catch (Exception e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
     执行时直接使用:
    
    public static boolean pair(String strAddr, String strPsw)
        {
            boolean result = false;
            BluetoothAdapter bluetoothAdapter = BluetoothAdapter
                    .getDefaultAdapter();
     
            bluetoothAdapter.cancelDiscovery();
     
            if (!bluetoothAdapter.isEnabled())
            {
                bluetoothAdapter.enable();
            }
     
            if (!BluetoothAdapter.checkBluetoothAddress(strAddr))
            { // 检查蓝牙地址是否有效
     
                Log.d("mylog", "devAdd un effient!");
            }
     
            BluetoothDevice device = bluetoothAdapter.getRemoteDevice(strAddr);
     
            if (device.getBondState() != BluetoothDevice.BOND_BONDED)
            {
                try
                {
                    Log.d("mylog", "NOT BOND_BONDED");
                    ClsUtils.setPin(device.getClass(), device, strPsw); // 手机和蓝牙采集器配对
                    ClsUtils.createBond(device.getClass(), device);
                    remoteDevice = device; // 配对完毕就把这个设备对象传给全局的remoteDevice
                    result = true;
                }
                catch (Exception e)
                {
                    // TODO Auto-generated catch block
     
                    Log.d("mylog", "setPiN failed!");
                    e.printStackTrace();
                } //
     
            }
            else
            {
                Log.d("mylog", "HAS BOND_BONDED");
                try
                {
                    ClsUtils.createBond(device.getClass(), device);
                    ClsUtils.setPin(device.getClass(), device, strPsw); // 手机和蓝牙采集器配对
                    ClsUtils.createBond(device.getClass(), device);
                    remoteDevice = device; // 如果绑定成功,就直接把这个设备对象传给全局的remoteDevice
                    result = true;
                }
                catch (Exception e)
                {
                    // TODO Auto-generated catch block
                    Log.d("mylog", "setPiN failed!");
                    e.printStackTrace();
                }
            }
            return result;
        }
  • 相关阅读:
    在注册表中添加windows鼠标右键菜单
    关于MVC中无法将类型为“System.Int32”的对象强制转换为类型“System.String”的问题。
    dns
    ntp
    研究比对搞定博客 canvas-nest.js
    linux 添加ssh和开启ssh服务apt管理的ubuntu
    xshll 连接ubuntu出现 ssh服务器拒绝了密码
    yum和rpm
    服务器无法远程连接原因分析
    关于服务器卡顿的几个原因
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4568702.html
Copyright © 2020-2023  润新知