• android 实现蓝牙自动配对连接


    BluetoothConnectActivityReceiver.java:监听蓝牙配对的广播
     
    代码:
     
    package com.imte.Broadcast;
     
    import com.imte.utils.ClsUtils;
     import com.itme.ActivityClass.R;
     
    import android.bluetooth.BluetoothDevice;
     import android.content.BroadcastReceiver;
     import android.content.Context;
     import android.content.Intent;
     import android.os.Handler;
     import android.util.Log;
     import android.widget.Toast;
     
    public class BluetoothConnectActivityReceiver extends BroadcastReceiver {
     
     String strPsw = "123456";
     
     @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);
        try {
         ClsUtils.setPin(btDevice.getClass(), btDevice, strPsw); // 手机和蓝牙采集器配对
         ClsUtils.createBond(btDevice.getClass(), btDevice);
         ClsUtils.cancelPairingUserInput(btDevice.getClass(), btDevice);
         Toast.makeText(
           context,
           context.getResources().getString(
             R.string.bluetooth_connect_success),
           Toast.LENGTH_SHORT);
        } catch (Exception e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
     //    Thread thread=new Thread(strPsw);
     //    thread.
        }
       }
     
     }
     }
     
    
    ClsUtils.java?
     
    package com.imte.utils;
     
    /************************************ 蓝牙配对函数 * **************/
     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();
       }
      }
     }
     
    最后就是MainActivity,用一个按钮来实现自动配对,代码如下:
     
    package com.itme.ActivityClass;
     
    import android.app.Activity;
     import android.bluetooth.BluetoothAdapter;
     import android.bluetooth.BluetoothDevice;
     import android.os.Bundle;
     import android.util.Log;
     import android.view.View;
     import android.view.View.OnClickListener;
     import android.widget.Button;
     
    import com.imte.utils.ClsUtils;
     
    public class MainActivity extends Activity implements OnClickListener{
         /** Called when the activity is first created. */
      private static BluetoothDevice remoteDevice=null;
      private Button btn_autopair=null;
      final static String ACTION_BLUETOOTHBC="android.bluetooth.device.action.PAIRING_REQUEST";
         @Override
         public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             setContentView(R.layout.main);
             btn_autopair=(Button)findViewById(R.id.btn_autopair);
             btn_autopair.setOnClickListener(this);
         }
         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);
     //    ClsUtils.cancelPairingUserInput(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这个类的的以下静态方法都是通过反射机制得到需要的方法
         ClsUtils.createBond(device.getClass(), device);//创建绑定
         ClsUtils.setPin(device.getClass(), device, strPsw); // 手机和蓝牙采集器配对
         ClsUtils.createBond(device.getClass(), device);
     //    ClsUtils.cancelPairingUserInput(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;
      }
      @Override
      public void onClick(View v) {
       // TODO Auto-generated method stub
       switch (v.getId()) {
       case R.id.btn_autopair:
        if (pair("94:DB:46:2B:A1:82", "123456")) {//pair的第一个参数是要配对的蓝牙地址,第二个参数是配对时预先设置的密钥
     
        Log.i("aaron", remoteDevice.getAddress());
        }
        break;
     
      default:
        break;
       }
      }
     }
     
    叮咚..如题的功能就实现了。。。
     
     
     
     
     
      项目源代码下载地址: http://download.csdn.net/detail/huangrangg12/4578242    
  • 相关阅读:
    Android 异步请求通用类
    Android 异步下载
    Eclipse 使用 VS Emulator for android 调试环境配置 步骤
    android ListView 可缩放,支持左右上下手势
    安卓中自定义控件引用
    java中的可释放资源定义,类似c#中的using
    java 实现自定义事件
    c# android 全局捕获未处理异常
    java android 捕获未处理异常
    java 中异常处理示例并捕获完整异常内容
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4504703.html
Copyright © 2020-2023  润新知