您当前的位置: 首页 >  搜索

Kevin-Dev

暂无认证

  • 4浏览

    0关注

    544博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Android -- 蓝牙】打开蓝牙和设备搜索

Kevin-Dev 发布时间:2022-05-25 13:49:17 ,浏览量:4

文章目录
      • 一、清单文件中,声明蓝牙权限和定位权限
      • 二、判断是否系统是否支持蓝牙
      • 三、判断蓝牙是否打开
      • 四、搜索设备
      • 五、获取本地蓝牙属性

一、清单文件中,声明蓝牙权限和定位权限

由于蓝牙扫描需要用到模糊定位权限( 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();
关注
打赏
1658837700
查看更多评论
立即登录/注册

微信扫码登录

0.0401s