最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Android 取消蓝牙配对框实现自动配对功能
时间:2017-04-06 编辑:简简单单 来源:一聚教程网
我看了几个文章,主要是接受配对广播,然后设置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 List 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 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(); } } |
相关文章
- sora软件价格介绍 02-22
- sora官网入口地址一览 02-22
- Sora生成的视频使用教程 02-22
- 《梦幻西游》元宵灯谜线索答案大全2024 02-22
- 《原神》有朋自远方来第一天通关攻略 02-22
- 《苏醒之路》四个结局达成攻略 02-22