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 实现蓝牙自动配对连接)