Android

关注公众号 jb51net

关闭
首页 > 软件编程 > Android > android 蓝牙配对

Android 取消蓝牙配对框实现自动配对功能

作者:caobai

这篇文章主要介绍了Android 取消蓝牙配对框实现自动配对功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下

我看了几个文章,主要是接受配对广播,然后设置pin,实现配对,但是网上的大部分手机是不可以的,Android.bluetoothdevice 下 action_pair_request ,没有定义这个,开始困扰了我一点时间,实现难度:是否能进入那个广播响应

定义了一个类,这个是网上的可以直接用

package zicox.esc; 
import java.lang.reflect.Method; 
import java.lang.reflect.Field; 
import android.bluetooth.BluetoothAdapter; 
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 www.jb51.net
  { 
    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(); 
    } 
  } 
  static public 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; 
  } 
} 
//================================================================================================================================

还有一部分 activity

//================================================================================================================================

package zicox.esc; 
import java.io.IOException; 
import java.io.UnsupportedEncodingException; 
import java.lang.reflect.Method; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.UUID; 
import android.app.Activity; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.bluetooth.BluetoothSocket; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.Toast; 
import android.widget.ToggleButton; 
public class Demo_ad_escActivity extends Activity 
{ 
  //--------------------------------------------------- 
  public static String ErrorMessage; 
  Button btnSearch, btnDis, btnExit; 
  ToggleButton tbtnSwitch;  
  ListView lvBTDevices;  
  ArrayAdapter<String> adtDevices;  
  List<String> lstDevices = new ArrayList<String>();  
  BluetoothAdapter btAdapt;  
  public static BluetoothSocket btSocket; 
  //--------------------------------------------------- 
  public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
   // if(!ListBluetoothDevice())finish(); 
    Button Button1 = (Button) findViewById(R.id.button1); 
    ErrorMessage = ""; 
    //--------------------------------------------------- 
    btnSearch = (Button) this.findViewById(R.id.btnSearch);  
    btnSearch.setOnClickListener(new ClickEvent());  
    btnExit = (Button) this.findViewById(R.id.btnExit);  
    btnExit.setOnClickListener(new ClickEvent());  
    btnDis = (Button) this.findViewById(R.id.btnDis);  
    btnDis.setOnClickListener(new ClickEvent());  
    // ToogleButton设置  
    tbtnSwitch = (ToggleButton) this.findViewById(R.id.toggleButton1);  
    tbtnSwitch.setOnClickListener(new ClickEvent()); 
    // ListView及其数据源 适配器  
    lvBTDevices = (ListView) this.findViewById(R.id.listView1);  
    adtDevices = new ArrayAdapter<String>(this,  
        android.R.layout.simple_list_item_1, lstDevices);  
    lvBTDevices.setAdapter(adtDevices);  
    lvBTDevices.setOnItemClickListener(new ItemClickEvent());  
    btAdapt = BluetoothAdapter.getDefaultAdapter();// 初始化本机蓝牙功能  
    if (btAdapt.isEnabled()) 
      tbtnSwitch.setChecked(false);  
    else 
      tbtnSwitch.setChecked(true);   
     // 注册Receiver来获取蓝牙设备相关的结果 
    String ACTION_PAIRING_REQUEST = "android.bluetooth.device.action.PAIRING_REQUEST"; 
    IntentFilter intent = new IntentFilter();  
    intent.addAction(BluetoothDevice.ACTION_FOUND);// 用BroadcastReceiver来取得搜索结果  
    intent.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);  
    intent.addAction(ACTION_PAIRING_REQUEST); 
    intent.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);  
    intent.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);  
    registerReceiver(searchDevices, intent);  
    Button1.setOnClickListener(new Button.OnClickListener() 
    { 
      public void onClick(View arg0) 
      { 
  //     Print1(SelectedBDAddress); 
      } 
    }); 
  } 
//--------------------------------------------------- 
  private BroadcastReceiver searchDevices = new BroadcastReceiver() {  
    public void onReceive(Context context, Intent intent) {  
      String action = intent.getAction();  
      Bundle b = intent.getExtras();  
      Object[] lstName = b.keySet().toArray();  
      // 显示所有收到的消息及其细节  
      for (int i = 0; i < lstName.length; i++) {  
        String keyName = lstName[i].toString();  
        Log.e(keyName, String.valueOf(b.get(keyName)));  
      }  
      BluetoothDevice device = null;  
      // 搜索设备时,取得设备的MAC地址  
      if (BluetoothDevice.ACTION_FOUND.equals(action)) {  
        device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);  
        if (device.getBondState() == BluetoothDevice.BOND_NONE) {  
          String str = "未配对|" + device.getName() + "|"  
              + device.getAddress();  
          if (lstDevices.indexOf(str) == -1)// 防止重复添加  
            lstDevices.add(str); // 获取设备名称和mac地址  
          adtDevices.notifyDataSetChanged(); 
          try { 
            ClsUtils.setPin(device.getClass(),device,"0000"); 
          } catch (Exception e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
          } 
          try { 
            ClsUtils.cancelPairingUserInput(device.getClass(), device); 
          } catch (Exception e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
          } 
        }  
      }else if(BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)){  
        device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);  
        switch (device.getBondState()) {  
        case BluetoothDevice.BOND_BONDING:  
          Log.d("BlueToothTestActivity", "正在配对......");  
          break;  
        case BluetoothDevice.BOND_BONDED:  
          Log.d("BlueToothTestActivity", "完成配对");  
          connect(device);//连接设备  
          break;  
        case BluetoothDevice.BOND_NONE:  
          Log.d("BlueToothTestActivity", "取消配对");  
        default:  
          break;  
        }  
      }  
      if (intent.getAction().equals("android.bluetooth.device.action.PAIRING_REQUEST")) 
      { 
        Log.e("tag11111111111111111111111", "ddd"); 
        BluetoothDevice btDevice = intent 
            .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
        // byte[] pinBytes = BluetoothDevice.convertPinToBytes("1234"); 
        // device.setPin(pinBytes); 
        try 
        { 
          ClsUtils.setPin(btDevice.getClass(), btDevice, "0000"); // 手机和蓝牙采集器配对 
          ClsUtils.createBond(btDevice.getClass(), btDevice); 
          ClsUtils.cancelPairingUserInput(btDevice.getClass(), btDevice); 
        } 
        catch (Exception e) 
        { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
        } 
      } 
    } 
  }; 
  class ItemClickEvent implements AdapterView.OnItemClickListener {  
    @Override  
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,  
        long arg3) {  
      if(btAdapt.isDiscovering())btAdapt.cancelDiscovery();  
      String str = lstDevices.get(arg2);  
      String[] values = str.split("\\|");  
      String address = values[2];  
      Log.e("address", values[2]);  
      BluetoothDevice btDev = btAdapt.getRemoteDevice(address);  
      try {  
        Boolean returnValue = false;  
        if (btDev.getBondState() == BluetoothDevice.BOND_NONE) {  
          //利用反射方法调用BluetoothDevice.createBond(BluetoothDevice remoteDevice);  
//          Method createBondMethod = BluetoothDevice.class.getMethod("createBond");  
//          Log.d("BlueToothTestActivity", "开始配对");  
//          returnValue = (Boolean) createBondMethod.invoke(btDev);  
          ClsUtils.pair(address, "0000"); 
          showMessage("here"); 
        }else if(btDev.getBondState() == BluetoothDevice.BOND_BONDED){  
          connect(btDev);  
        }  
      } catch (Exception e) {  
        e.printStackTrace();  
      }  
    }  
  }  
  private void connect(BluetoothDevice btDev) { 
    final UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 
    UUID uuid = SPP_UUID;  
    try {  
      btSocket = btDev.createRfcommSocketToServiceRecord(uuid);  
      Log.d("BlueToothTestActivity", "开始连接...");  
      btSocket.connect();  
    } catch (IOException e) {  
      // TODO Auto-generated catch block  
      e.printStackTrace();  
    }  
  }  
  class ClickEvent implements View.OnClickListener {  
    @Override  
    public void onClick(View v) {  
      if (v == btnSearch)// 搜索蓝牙设备,在BroadcastReceiver显示结果  
      {  
        if (btAdapt.getState() == BluetoothAdapter.STATE_OFF) {// 如果蓝牙还没开启  
          Toast.makeText(Demo_ad_escActivity.this, "请先打开蓝牙", 1000).show();          return;  
        }  
        if (btAdapt.isDiscovering())  
          btAdapt.cancelDiscovery();  
        lstDevices.clear();  
        Object[] lstDevice = btAdapt.getBondedDevices().toArray();  
        for (int i = 0; i < lstDevice.length; i++) {  
          BluetoothDevice device = (BluetoothDevice) lstDevice[i];  
          String str = "已配对|" + device.getName() + "|"  
              + device.getAddress();  
          lstDevices.add(str); // 获取设备名称和mac地址  
          adtDevices.notifyDataSetChanged();  
        }  
        setTitle("本机蓝牙地址:" + btAdapt.getAddress());  
        btAdapt.startDiscovery();  
      } else if (v == tbtnSwitch) {// 本机蓝牙启动/关闭  
        if (tbtnSwitch.isChecked() == false)  
          btAdapt.enable();  
        else if (tbtnSwitch.isChecked() == true)  
          btAdapt.disable();  
      } else if (v == btnDis)// 本机可以被搜索  
      {  
        Intent discoverableIntent = new Intent(  
            BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);  
        discoverableIntent.putExtra(  
            BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);  
        startActivity(discoverableIntent);  
      } else if (v == btnExit) {  
        try {  
          if (btSocket != null)  
            btSocket.close();  
        } catch (IOException e) {  
          e.printStackTrace();  
        }  
        Demo_ad_escActivity.this.finish();  
      }  
    }  
  } 
  @Override  
  protected void onDestroy() {  
    this.unregisterReceiver(searchDevices);  
    super.onDestroy();  
    android.os.Process.killProcess(android.os.Process.myPid());  
  }  
  public void showMessage(String str) 
  { 
    Toast.makeText(this,str, Toast.LENGTH_LONG).show(); 
  } 
}

以上所述是小编给大家介绍的Android 取消蓝牙配对框实现自动配对功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

您可能感兴趣的文章:
阅读全文