- 搜索设备
1).搜索设备之前需要判断是否正在被搜索,如果正在搜索则取消搜索后再搜索
BluetoothAdapter . concelDiscovery(); //关闭搜索
BluetoothAdapter . startDiscovery(); //开启搜索
(代码位置在BluetoothSettingFragment中)
2)还需要注册蓝牙广播,当扫描到设备时才方便处理:
(代码位置:BluetoothBoxService中)
BluetoothAdapter . ACTION_STATE_CHANGEN //蓝牙状态改变广播
BluetoothDevice . ACTION_FOUND //找到设备的广播
BluetoothAdapter . ACTION_DISCOVERY_FINISHED //搜索完成的广播
BluetoothAdapter . ACTION_DISCOVERY_STARTED //开始扫描的关闭
BluetoothDevice . ACTION_BOND_STATE_CHANGEN //状态改变
BluetoothDevice . ACTION_PAIRING_REQUEST //蓝牙配对请求
BluetoothDevice . .ACTION_CONNECTION_STATE_CHANGED //蓝牙连接状态
BluetoothA2dp . ACTION_PLAYING_STATE_CHANGED //A2dp播放状态
等。
3)广播接收器(BluetoothReceiver)
Android 通过广播接收器(BluetoothReceiver)接收注册广播发送的信息,以此来监听蓝牙的一系列状态变化,包括(蓝牙开关状态,蓝牙搜索状态,蓝牙连接状态,A2dp连接状态等),根据蓝牙一系列状态的变化来进行相应的状态处理。
代码中创建一个BTBroadcastReceiver继承BroadcastReceiver来接收广播信息,
4)搜索蓝牙设备
1.搜索蓝牙设备时首先通过接收到的广播信息(BluetoothDevice . ACTION_FOUND)来判断蓝牙搜索功能是否开启,然后通过intent.getParcelableExtra这个函数和BluetoothDevice . EXTRA_DEVICE这个常量,BluetoothDevice . EXTRA_DEVICE就是intent中用来存储蓝牙设备对象的常量,从这个对象中来获取搜索到的蓝牙设备的名称和地址。把搜索的设备和地址放到List集合中通过ListView在界面中显示,
(代码在BluetoothBoxService中)
2.系统会保存之前配对过的蓝牙设备,所以要对搜索到的设备进行过滤,判断蓝牙是否配对过,也可以直接获取之前配对过的设备;
//判断是否配对
If(device.getBondState()!=BluetoothDevice.BOND_BONDED)
//直接获取之前配对过的设备
Set<BluetoothDevice> pairedDevices=BluetoothAdapter.getBondDevices()
3.Android 6.0以后蓝牙使用权限要加上定位权限,没有加入定位权限,导致startDiscovery方法无法回调BroadcastReceiver,使得搜索功能一直无法实现
代码:
Manifest.permission.ACCESS_COARSE_LOCATION!=PackageManager.PERMISSION_GRANTED
Manifest.permission.ACCESS_COARSE_LOCATION
PERMISSION_REQUEST_COARSE_LOCATION
4.startDiscovery(开启搜索功能)方法回调问题解决,解决ListView显示蓝牙设备的重复添加问题
解决办法:在开启搜索功能的点击事件和其他开启方法时判断你存放搜索到的蓝牙设备的名称和地址的List<>集合是否为空,不为空则清空在搜索。
- 蓝牙配对
- 之前将获取到的蓝牙设备展示在ListView的列表中,所以要为ListView中的列表增加点击事件(BluetoothDeviceSearchAdapter中),在进行配对是还有对蓝牙搜索状态进行判断,如果在搜索过程中则取消搜索;
//判断是否在搜索过程中
If(Bluetoothadapter.isDiscovering())
{ BluetoothAdapter.CancelDiscovery() }
- 在配对之前还有根据你所点击的ListItem中的列表项获取相对应的蓝牙//设备后才能进行蓝牙配对和连接;
List<BluetoothDevicesearch> mBluetoothDevicesearch;
//列表项获取设备
BluetoothDevicesearch bean=mBluetoothDevicesearch.get(position);
//根据列表项获取到的设备获取它的设备地址
String address =bean.getAddress();
BluetoothDevice device= BluetoothAdapter.getRemoteDevice(address)
- 蓝牙配对有点击配对和自动配对
点击配对:选择设备的俩个手机弹出配对确认框,点击确定后配对
自动配对:搜索到蓝牙设备后自动配对不需要输入PIN码(开发中不建议使用)
在开发过程中采用的是点击配对方式:
点击配对调用(BluetoothDevice.class.getMethod)进行配对(代码位置BluetoothCreatedBond)
Boolean returnValue=(Boolean) method.invoke(device);中的invoke传递的参数就是从ListView的列表项中获取的设备
- 如果想要配对过的设备取消配对,只需要将createdBond改为removeBond;
本文详细介绍了在Android平台上搜索蓝牙设备、处理搜索过程中的权限问题、避免搜索结果重复添加的方法,以及如何进行蓝牙配对,包括点击配对和自动配对的实现方式。
5788

被折叠的 条评论
为什么被折叠?



