蓝牙配对
权限
<uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
使用蓝牙要用到官方的蓝牙适配器 android.bluetooth.BluetoothAdapter 和广播
先判断手机是否支持蓝牙
private void initBluetooth() { bluetoothAdapter = android.bluetooth.BluetoothAdapter.getDefaultAdapter(); if (bluetoothAdapter == null) { Toast.makeText(BlueActivity.this, "设备不支持蓝牙", Toast.LENGTH_LONG).show(); } }
广播
private BroadcastReceiver bluetoothreceiver=new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { switch (intent.getAction()){ case BluetoothDevice.ACTION_FOUND: BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); Logger.e("ACTION_FOUND " + device.toString()); //adapter.add(device); break; case android.bluetooth.BluetoothAdapter.ACTION_DISCOVERY_STARTED: Logger.e("开始扫描"); break; case android.bluetooth.BluetoothAdapter.ACTION_DISCOVERY_FINISHED: Logger.e("扫描结束"); break; } } };
注册接受者 onDestroy时要注销
private void initReceiver() { IntentFilter filter = new IntentFilter(); filter.addAction(BluetoothDevice.ACTION_FOUND); filter.addAction(android.bluetooth.BluetoothAdapter.ACTION_DISCOVERY_STARTED); filter.addAction(android.bluetooth.BluetoothAdapter.ACTION_DISCOVERY_FINISHED); registerReceiver(bluetoothreceiver, filter); }
开启关闭蓝牙,扫描停止。
public void bluetooth(View view) { switch (view.getId()) { case R.id.btn_open_bluetooth: if (!bluetoothAdapter.isEnabled()) { bluetoothAdapter.enable(); } break; case R.id.btn_close_bluetooth: if (bluetoothAdapter.isEnabled()) { bluetoothAdapter.disable(); } break; case R.id.btn_scan: bluetoothAdapter.startDiscovery(); break; case R.id.btn_stop_scan: bluetoothAdapter.cancelDiscovery(); break; } }
如果想用list显示 扫描出来的设备,实体可以用官方的 BluetoothDevice
通过这个device 可以获取很多属性
getBondState 返回10 代表没有配对 12 代表已经配对 11代表配对中
getAddress 代表蓝牙地址 有的手机mac地址和蓝牙非常相似,只有几个字符不同
getName 可以手机的名字 这个可以在设置里面修改
getTpye 获取对方设备支持的蓝牙协议 通常都是 返回1
public static final int DEVICE_TYPE_CLASSIC = 1; public static final int DEVICE_TYPE_DUAL = 3; public static final int DEVICE_TYPE_LE = 2; public static final int DEVICE_TYPE_UNKNOWN = 0;
getUuids 这里有一个s,说明肯定不止一个,至于为什么 我也不知道
值得注意的是 如果没有进行配对,用这个方法只会得到一个null,而只有配对之后再调用这个方法才会得到 一个 ParcelUuid[] 对象
经过测试 发现一部手机是8个 一部手机是10个
其中一个的uuid
0000112d-0000-1000-8000-00805f9b34fb
除了红色部分会变化,其他地方都不会改变,两部手机肯定也会出现同样的uuid的情况,到底用来干啥的,暂时不清楚
输出 每个uuid的方法
Parcelable[] uuidExtra = device.getUuids(); for (int i=0; i<uuidExtra.length; i++) { String uuid = uuidExtra[i].toString(); }
在广播 中接受到 BluetoothDevice.ACTION_FOUND 时,可以获取搜索到的设备
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
如果想加载到list上 可以用list的适配器add
现在list上显示了搜索出来的设备,如果想通过点击来配对目标设备
在安卓4.4 Api 19之后,配对起来很简单
device.createBond();
此时双方手机界面会显示
但是Api 19之前是不能用这个方法的,系统隐藏了,不过可以用反射
try { Method createBondMethod = BluetoothDevice.class.getMethod("createBond"); createBondMethod.invoke(device); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); }