zoukankan      html  css  js  c++  java
  • 如何实现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;
        }
  • 相关阅读:
    hdu 4027 Can you answer these queries?
    hdu 4041 Eliminate Witches!
    hdu 4036 Rolling Hongshu
    pku 2828 Buy Tickets
    hdu 4016 Magic Bitwise And Operation
    pku2886 Who Gets the Most Candies?(线段树+反素数打表)
    hdu 4039 The Social Network
    hdu 4023 Game
    苹果官方指南:Cocoa框架(2)(非原创)
    cocos2d 中 CCNode and CCAction
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4568702.html
Copyright © 2011-2022 走看看