文章目录
一、清单文件中,声明蓝牙权限和定位权限
- 一、清单文件中,声明蓝牙权限和定位权限
- 二、判断是否系统是否支持蓝牙
- 三、判断蓝牙是否打开
- 四、搜索设备
- 五、获取本地蓝牙属性
、
由于蓝牙扫描需要用到模糊定位权限( Android10
后需要精准定位权限 ),所以 Android6.0
之后,除了在 AndroidManifest.xml
中申明权限之外,还需要动态申请定位权限,才可进行蓝牙扫描,否则不会扫描到任何 BLE 设备。
在使用蓝牙之前,我们首先要判断手机设备是否支持蓝牙,虽然现在基本都支持蓝牙了,但是为了代码的严谨性我们还是需要在代码中判断:
private BluetoothManager bluetoothmanger;
private BluetoothAdapter bluetoothadapter;
/**
判断设备是否支持蓝牙
*/
bluetoothmanger = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
bluetoothadapter = bluetoothmanger.getAdapter();
if (bluetoothadapter == null) {
Toast.makeText(MainActivity.this, "设备不支持蓝牙", Toast.LENGTH_SHORT).show();
}
三、判断蓝牙是否打开
/**
* 判断蓝牙是否开启
*
* @return
*/
public boolean blueisenable() {
if (bluetoothadapter.isEnabled()) {
return true;
} else {
return false;
}
}
mBluetoothAdapter.isEnabled()
判断当前蓝牙是否打开,如果蓝牙处于打开状态返回 true。
同时可以在 Activity 层通过广播监听蓝牙的关闭与开启。
new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//获取蓝牙广播 本地蓝牙适配器的状态改变时触发
String action = intent.getAction();
if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
//获取蓝牙广播中的蓝牙新状态
int blueNewState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0);
//获取蓝牙广播中的蓝牙旧状态
int blueOldState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0);
switch (blueNewState) {
//正在打开蓝牙
case BluetoothAdapter.STATE_TURNING_ON:
break;
//蓝牙已打开
case BluetoothAdapter.STATE_ON:
break;
//正在关闭蓝牙
case BluetoothAdapter.STATE_TURNING_OFF:
break;
//蓝牙已关闭
case BluetoothAdapter.STATE_OFF:
break;
}
}
}
};
四、搜索设备
搜索之前我们需要判断是否正在搜索,如果正在搜索则取消搜索后再搜索,使用:
if (bluetoothadapter.isDiscovering()) {
bluetoothadapter.cancelDiscovery();
}
bluetoothadapter.startDiscovery();
这样蓝牙就开始搜索设备了,此外我们还需要注册蓝牙广播,当扫描到设备时才方便做处理
设置蓝牙广播过滤器也就是添加广播类型,在这里我们把蓝牙状态改变、搜索到设备、搜索完成等广播都添加进来,后续都可以用到
/**
* 蓝牙广播过滤器
* 蓝牙状态改变
* 找到设备
* 搜索完成
* 开始扫描
* 状态改变
*
* @return
*/
public IntentFilter makeFilter() {
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);//蓝牙状态改变的广播
filter.addAction(BluetoothDevice.ACTION_FOUND);//找到设备的广播
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);//搜索完成的广播
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);//开始扫描的广播
filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);//状态改变
return filter;
}
新建广播 BlueToothReceiver,在OnReceive中判断,当查找到设备时我们可以得到device,在这里做处理即可,在这里我们是将设备存放在list集合中,方便做后续处理,读者可自行做处理,记得在Activity或者AndroidManifest.xml注册广播。
case BluetoothDevice.ACTION_FOUND:
Log.d(TAG, "查找设备");
BluetoothDevice device = intent
.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
EventBus.getDefault().post(new BluRxBean(findDevice,device));
break;
五、获取本地蓝牙属性
//获取本地蓝牙名称
String name = bluetoothadapter.getName();
//获取本地蓝牙地址
String address = bluetoothadapter.getAddress();