Android 蓝牙连接

RxAndroidBle连接库只能扫描出Ble类型设备

使用原生Android扫描出设备获取Mac地址,然后用RxAndroidBle连接


    fun scanBleDeviceNative(deviceName: String) {
        val adapter =
            (context.getSystemService(Context.BLUETOOTH_SERVICE) as android.bluetooth.BluetoothManager).adapter

        if (adapter == null || !adapter.isEnabled) {
            Timber.tag(TAG).w("蓝牙未开启")
            return
        }

        // 如果之前正在扫描,先取消
        if (adapter.isDiscovering) adapter.cancelDiscovery()

        // 监听经典蓝牙发现广播
        val receiver = object : BroadcastReceiver() {
            override fun onReceive(context: Context, intent: Intent) {
                when (intent.action) {
                    BluetoothDevice.ACTION_FOUND -> {
                        val device: BluetoothDevice? =
                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                                intent.getParcelableExtra(
                                    BluetoothDevice.EXTRA_DEVICE,
                                    BluetoothDevice::class.java
                                )
                            } else {
                                @Suppress("DEPRECATION")
                                intent.getParcelableExtra<BluetoothDevice>(BluetoothDevice.EXTRA_DEVICE)
                            }
                        device?.let {
                            val name = it.name ?: return
                            if (name.contains(deviceName, ignoreCase = true)) {
                                Timber.tag(TAG)
                                    .d("找到设备: $name ${device.address}")

                                // 将经典 BluetoothDevice 转为 RxBleDevice 对象
                                val bleDevice = rxBleClient.getBleDevice(device.address)
                                // 连接 到设备....

                                // 停止扫描
                                try {
                                    adapter.cancelDiscovery()
                                } catch (_: Exception) {
                                }
                                context.unregisterReceiver(this)
                            }
                        }
                    }

                    BluetoothAdapter.ACTION_DISCOVERY_FINISHED -> {
                        Timber.tag(TAG).d("扫描结束")
                        context.unregisterReceiver(this)
                    }
                }
            }
        }

        val filter = IntentFilter(BluetoothDevice.ACTION_FOUND).apply {
            addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)
        }
        context.registerReceiver(receiver, filter)

        // 启动蓝牙扫描
        adapter.startDiscovery()
        Timber.tag(TAG).d("开始扫描")

        // 设置 10 秒超时停止扫描
        Handler(Looper.getMainLooper()).postDelayed({
            try {
                if (adapter.isDiscovering) adapter.cancelDiscovery()
                Timber.tag(TAG).d("扫描超时,已停止")
                context.unregisterReceiver(receiver)
            } catch (_: Exception) {
            }
        }, 10_000)
    }