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

时间:2021-06-20  来源:Action  阅读:

我看了几个文章,主要是接受配对广播,然后设置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);

    returnreturnValue.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);

    returnreturnValue.booleanValue();

  }

  static public boolean setPin(Class btClass, BluetoothDevice btDevice,

      String str) throws Exception

  {

    try

    {

      Method removeBondMethod = btClass.getDeclaredMethod("setPin",

          newClass[]

          {byte[].class});

      Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice,

          newObject[]

          {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();

    }

    returntrue;

  }

  // 取消用户输入

  static public boolean cancelPairingUserInput(Class btClass,

      BluetoothDevice device)

  throws Exception

  {

    Method createBondMethod = btClass.getMethod("cancelPairingUserInput");

    // cancelBondProcess()

    Boolean returnValue = (Boolean) createBondMethod.invoke(device);

    returnreturnValue.booleanValue();

  }

  // 取消配对

  static public boolean cancelBondProcess(Class btClass,

      BluetoothDevice device)

  throws Exception

  {

    Method createBondMethod = btClass.getMethod("cancelBondProcess");

    Boolean returnValue = (Boolean) createBondMethod.invoke(device);

    returnreturnValue.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();

      }

    }

    returnresult;

  }

}

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

 

还有一部分 activity

 

 代码如下

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

 

packagezicox.esc;

importjava.io.IOException;

importjava.io.UnsupportedEncodingException;

importjava.lang.reflect.Method;

importjava.util.ArrayList;

importjava.util.List;

importjava.util.UUID;

importandroid.app.Activity;

importandroid.bluetooth.BluetoothAdapter;

importandroid.bluetooth.BluetoothDevice;

importandroid.bluetooth.BluetoothSocket;

importandroid.content.BroadcastReceiver;

importandroid.content.Context;

importandroid.content.Intent;

importandroid.content.IntentFilter;

importandroid.os.Bundle;

importandroid.util.Log;

importandroid.view.View;

importandroid.widget.AdapterView;

importandroid.widget.ArrayAdapter;

importandroid.widget.Button;

importandroid.widget.ListView;

importandroid.widget.Toast;

importandroid.widget.ToggleButton;

publicclassDemo_ad_escActivityextendsActivity

{

  //---------------------------------------------------

  publicstaticString ErrorMessage;

  Button btnSearch, btnDis, btnExit;

  ToggleButton tbtnSwitch; 

  ListView lvBTDevices; 

  ArrayAdapter adtDevices; 

  List lstDevices =newArrayList(); 

  BluetoothAdapter btAdapt; 

  publicstaticBluetoothSocket btSocket;

  //---------------------------------------------------

  publicvoidonCreate(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(newClickEvent()); 

    btnExit = (Button)this.findViewById(R.id.btnExit); 

    btnExit.setOnClickListener(newClickEvent()); 

    btnDis = (Button)this.findViewById(R.id.btnDis); 

    btnDis.setOnClickListener(newClickEvent()); 

    // ToogleButton设置 

    tbtnSwitch = (ToggleButton)this.findViewById(R.id.toggleButton1); 

    tbtnSwitch.setOnClickListener(newClickEvent());

    // ListView及其数据源 适配器 

    lvBTDevices = (ListView)this.findViewById(R.id.listView1); 

    adtDevices =newArrayAdapter(this, 

        android.R.layout.simple_list_item_1, lstDevices); 

    lvBTDevices.setAdapter(adtDevices); 

    lvBTDevices.setOnItemClickListener(newItemClickEvent()); 

    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 =newIntentFilter(); 

    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(newButton.OnClickListener()

    {

      publicvoidonClick(View arg0)

      {

  //     Print1(SelectedBDAddress);

      }

    });

  }

//---------------------------------------------------

  privateBroadcastReceiver searchDevices =newBroadcastReceiver() { 

    publicvoidonReceive(Context context, Intent intent) { 

      String action = intent.getAction(); 

      Bundle b = intent.getExtras(); 

      Object[] lstName = b.keySet().toArray(); 

      // 显示所有收到的消息及其细节 

      for(inti =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();

          }

        } 

      }elseif(BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)){ 

        device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 

        switch(device.getBondState()) { 

        caseBluetoothDevice.BOND_BONDING: 

          Log.d("BlueToothTestActivity","正在配对......"); 

          break; 

        caseBluetoothDevice.BOND_BONDED: 

          Log.d("BlueToothTestActivity","完成配对"); 

          connect(device);//连接设备 

          break; 

        caseBluetoothDevice.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();

        }

      }

    }

  };

  classItemClickEventimplementsAdapterView.OnItemClickListener { 

    @Override 

    publicvoidonItemClick(AdapterView arg0, View arg1,intarg2, 

        longarg3) { 

      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");

        }elseif(btDev.getBondState() == BluetoothDevice.BOND_BONDED){ 

          connect(btDev); 

        } 

      }catch(Exception e) { 

        e.printStackTrace(); 

      } 

    } 

  } 

  privatevoidconnect(BluetoothDevice btDev) {

    finalUUID 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(); 

    } 

  } 

  classClickEventimplementsView.OnClickListener { 

    @Override 

    publicvoidonClick(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(inti =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(); 

      }elseif(v == tbtnSwitch) {// 本机蓝牙启动/关闭 

        if(tbtnSwitch.isChecked() ==false) 

          btAdapt.enable(); 

        elseif(tbtnSwitch.isChecked() ==true) 

          btAdapt.disable(); 

      }elseif(v == btnDis)// 本机可以被搜索 

      { 

        Intent discoverableIntent =newIntent( 

            BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 

        discoverableIntent.putExtra( 

            BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,300); 

        startActivity(discoverableIntent); 

      }elseif(v == btnExit) { 

        try{ 

          if(btSocket !=null) 

            btSocket.close(); 

        }catch(IOException e) { 

          e.printStackTrace(); 

        } 

        Demo_ad_escActivity.this.finish(); 

      } 

    } 

  }

  @Override 

  protectedvoidonDestroy() { 

    this.unregisterReceiver(searchDevices); 

    super.onDestroy(); 

    android.os.Process.killProcess(android.os.Process.myPid()); 

  } 

  publicvoidshowMessage(String str)

  {

    Toast.makeText(this,str, Toast.LENGTH_LONG).show();

  }

}

 

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

http://m.bbyears.com/flash/124846.html

推荐访问:android学习路线
相关阅读 猜你喜欢
本类排行 本类最新