引言: 最近在新的项目中再次用到蓝牙相关的检索和连接的工作,好记性不如烂笔头,在这里
做下笔记,方便以后自己的复习和翻阅学习.
1. AndroidManifest.xml 文件 申请蓝牙相关权限
// 管理蓝牙设备的权限
<uses-permissionandroid:name="Android.permission.BLUETOOTH_ADMIN" />
// 使用蓝牙设备的权限
<uses-permissionandroid:name="android.permission.BLUETOOTH" />
2. 检测蓝牙是否正常并打开
// 检查设备是否支持蓝牙
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
// 设备不支持蓝牙
AppUtils.showToast(BlueToothSelectActivity.this, "该设备暂不支持蓝牙设备");
}
// 打开蓝牙
if (!mBluetoothAdapter.isEnabled()) {
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
// 设置蓝牙可见性,最多300秒
intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
BlueToothSelectActivity.this.startActivity(intent);
}
3. 蓝牙设备分为 已经配对过得设备
// 获取所有已经绑定的蓝牙设备
Set<BluetoothDevice> devices = mBluetoothAdapter.getBondedDevices();
if (devices.size() > 0) {
tvMsg.setText("注意: 已经绑定的设备 不一定是可以连接状态 ");
BlueToothBean bt = new BlueToothBean();
bt.setNumber("");
bt.setName(" - 已绑定的蓝牙设备 - ");
btLists.add(bt);
for (BluetoothDevice bluetoothDevice : devices) {
Log.d(TAG, "蓝牙设备信息 ----->" + bluetoothDevice.getName() + " - " + bluetoothDevice.getAddress());
// 本地蓝牙实体类 包含 蓝牙名字和蓝牙地址信息的保存
BlueToothBean btBean = new BlueToothBean();
btBean.setName(bluetoothDevice.getName());
btBean.setNumber(bluetoothDevice.getAddress());
for (int i = 0; i < btLists.size(); i++) {
if (btLists.get(i).getNumber().equals(btBean.getNumber())) {
isExist = true;
}
}
if (!isExist) {
btLists.add(btBean);
}
btSelectAdapter.notifyDataSetChanged();
}
}
直接从蓝牙适配器中取到之前已经配对过得设备信息,如果有就添加到 界面的 列表中.(注意 开发中发现 如果已经配对过但是也有没有连接成功的情况.配对但不一定连接!)
4. 另一种设备信息 是附近的蓝牙设备的搜索
首先 要想获取到附近的蓝牙信息需要 以广播的形式进行传播得到反馈.
// 设置广播信息过滤
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
intentFilter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
intentFilter.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
// 注册广播接收器,接收并处理搜索结果
BlueToothSelectActivity.this.registerReceiver(mReceiver, intentFilter);
// 寻找蓝牙设备,android会将查找到的设备以广播形式发出去
mBluetoothAdapter.startDiscovery();
在代码中进行动态的蓝牙广播的注册,当然也可以静态注册,但是个人更倾向于动态注册,需要的时候进行注册,如果在清单文件中注册,表示在开始得时候已经对蓝牙广播进行了注册.(个人感觉太早了....)
5. 自定义广播接收器 获取反馈信息 (包括 搜索 显示 和判断address 进行连接)
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
// 获取查找到的蓝牙设备
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (isFirst) {
BlueToothBean btBean = new BlueToothBean();
btBean.setName(" - 附近的蓝牙设备 - ");
btBean.setNumber("");
btLists.add(btBean);
isFirst = false;
}
if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
BlueToothBean btBean = new BlueToothBean();
btBean.setName(device.getName());
btBean.setNumber(device.getAddress());
for (int i = 0; i < btLists.size(); i++) {
if (btLists.get(i).getNumber().equals(btBean.getNumber())) {
isExist = true;
}
}
if (!isExist) {
btLists.add(btBean);
}
btSelectAdapter.notifyDataSetChanged();
} else if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {
setProgressBarIndeterminateVisibility(false);
setTitle("搜索蓝牙设备完成");
}
// 如果查找到的设备符合要连接的设备,处理 JLP352-5087
try {
if (device != null && device.getAddress().equalsIgnoreCase("8C:DE:52:F0:50:87")) {
// 搜索蓝牙设备的过程占用资源比较多,一旦找到需要连接的设备后需要及时关闭搜索
if (mBluetoothAdapter.isDiscovering() || mBluetoothAdapter != null) {
mBluetoothAdapter.cancelDiscovery();
}
// 获取蓝牙设备的连接状态
int connectState = device.getBondState();
switch (connectState) {
// 未配对
case BluetoothDevice.BOND_NONE:
// 配对
try {
Method createBondMethod = BluetoothDevice.class.getMethod("createBond");
createBondMethod.invoke(device);
} catch (Exception e) {
e.printStackTrace();
}
break;
// 已配对
case BluetoothDevice.BOND_BONDED:
try {
// 连接
connect(device);
} catch (IOException e) {
e.printStackTrace();
}
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
} else if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {
// 状态改变的广播
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// JLP352-5087
if (device.getAddress().equals("")) {
int connectState = device.getBondState();
switch (connectState) {
case BluetoothDevice.BOND_NONE:
break;
case BluetoothDevice.BOND_BONDING:
break;
case BluetoothDevice.BOND_BONDED:
try {
// 连接
connect(device);
} catch (IOException e) {
e.printStackTrace();
}
break;
}
}
}
连接蓝牙 connect(device) 方法
private void connect(BluetoothDevice device) throws IOException {
// 固定的UUID
final String SPP_UUID = "00001101-0000-1000-8000-00805F9B34FB";
UUID uuid = UUID.fromString(SPP_UUID);
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(uuid);
socket.connect();
}
在这里也感谢前辈
无私奉献的精神.
取消注册
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mReceiver);
}
按钮点击进行蓝牙搜索
// 如果正在搜索,就先取消搜索
if (mBluetoothAdapter.isDiscovering()) {
mBluetoothAdapter.cancelDiscovery();
}
// 开始搜索蓝牙设备,搜索到的蓝牙设备通过广播返回
mBluetoothAdapter.startDiscovery();
上海 小白