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

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

<!--蓝牙权限-->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-feature android:name="android.hardware.location.gps" />
<uses-feature
    android:name="android.hardware.bluetooth_le"
    android:required="true" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

由于蓝牙扫描需要用到模糊定位权限( 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();
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kevin-Dev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值