栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

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

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 
{ 
   
  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(); 
  } 
   
  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(); 
  } 
   
  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 adtDevices;  
  List lstDevices = new ArrayList();  
  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(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 取消蓝牙配对框实现自动配对功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对考高分网网站的支持!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/159827.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号