Android BlueTooth搜索附近和连接

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27948659/article/details/72683296

引言: 最近在新的项目中再次用到蓝牙相关的检索和连接的工作,好记性不如烂笔头,在这里
做下笔记,方便以后自己的复习和翻阅学习.

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();
    }

http://blog.csdn.net/centralperk/article/details/8080908 在这里也感谢前辈
无私奉献的精神.

取消注册

@Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mReceiver);
    }

按钮点击进行蓝牙搜索

// 如果正在搜索,就先取消搜索
                if (mBluetoothAdapter.isDiscovering()) {
                    mBluetoothAdapter.cancelDiscovery();
                }
                // 开始搜索蓝牙设备,搜索到的蓝牙设备通过广播返回
                mBluetoothAdapter.startDiscovery();
                                               上海 小白

猜你喜欢

转载自blog.csdn.net/qq_27948659/article/details/72683296