蓝牙自动配对 4.2.2
这几天一直都在研究Android手机上蓝牙的自动配对与连接。
整理一下思路,整体的流程是:
1. 首先注册蓝牙的广播消息
/** * 蓝牙的隐藏action,主要是配对时弹出配对对话框时会响应该消息 */ protected static final String sPairingName = "android.bluetooth.device.action.PAIRING_REQUEST"; public void register(Context context) { IntentFilter filter = new IntentFilter(); filter.addAction(BluetoothDevice.ACTION_FOUND); // 发现蓝牙设备 filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED); // 蓝牙设备配对状态发生改变,详细可查看官方文档 filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); // 蓝牙开始扫描 filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); // 蓝牙扫描结束 filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); // 蓝牙状态改变,即开启或者关闭,多种状态 filter.addAction(sPairingName); context.registerReceiver(this, filter); }
2. 如何配对蓝牙
在发现蓝牙设备后,可以获取到BluetoothDevice的对象
if (action.equals(BluetoothDevice.ACTION_FOUND)) { BluetoothDevice device = intent .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); }
这里就可以进行配对操作。。不过官方将创建配对的API给隐藏了起来。下面我门来看看与自动配对相关的几个函数,来自BluetoothDevice
/** * Start the bonding (pairing) process with the remote device. * <p>This is an asynchronous call, it will return immediately. Register * for {@link #ACTION_BOND_STATE_CHANGED} intents to be notified when * the bonding process completes, and its result. * <p>Android system services will handle the necessary user interactions * to confirm and complete the bonding process. * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}. * * @return false on immediate error, true if bonding will begin * @hide // 该函数是对外公开的,但是在这里加上hide之后,IDE中无法直接调用需要通过反射来调用 */ public boolean createBond() { if (sService == null) { Log.e(TAG, "BT not enabled. Cannot create bond to Remote Device"); return false; } try { return sService.createBond(this); } catch (RemoteException e) {Log.e(TAG, "", e);} return false; }
通过反射来调用createBond,下面的代码是反射“createBond”方法,createBond会激发蓝牙事件 BluetoothDevice.ACTION_BOND_STATE_CHANGED与
"android.bluetooth.device.action.PAIRING_REQUEST",在4.2.2版本的Android上这里会弹出配对对话框。
public void bond() { Method createBondMethod; try { createBondMethod = mDevice.getClass().getMethod("createBond"); createBondMethod.invoke(mDevice); } catch (Exception e) { e.printStackTrace(); } }
在"android.bluetooth.device.action.PAIRING_REQUEST"事件下,反射调用setPin方法,设置PIN码,然后在调用一次createBond就会将配对对话框隐藏掉。
会有一点点延迟,这里需要继续跟进,看能否不让其弹出。