应用程序找不到手机蓝牙设备

App doesn't find mobile phones bluetooth devices

我无法通过蓝牙搜索找到任何手机 phone(我的意思是可用的未配对设备)。我有这个代码来搜索设备:

fun searchDevices() {
        val adapter = BluetoothAdapter.getDefaultAdapter()
        val scanner = adapter.bluetoothLeScanner

        val scanSettingsBuilder = ScanSettings.Builder()
            .setScanMode(ScanSettings.SCAN_MODE_BALANCED)
            .setReportDelay(0L)

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            scanSettingsBuilder
                .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
                .setMatchMode(ScanSettings.MATCH_MODE_AGGRESSIVE)
                .setNumOfMatches(ScanSettings.MATCH_NUM_ONE_ADVERTISEMENT)
        }

        val scanSettings = scanSettingsBuilder.build()

        val scanCallback: ScanCallback = object : ScanCallback() {
            override fun onScanResult(callbackType: Int, result: ScanResult) {
                val device: BluetoothDevice = result.device
                val deviceName = device.name ?: result.scanRecord?.deviceName
                Log.d(TAG, "Available device name: $deviceName")
                // ...do whatever you want with this found device
            }

            override fun onBatchScanResults(results: List<ScanResult?>?) {
                Log.d(TAG, "results: $results")
            }

            override fun onScanFailed(errorCode: Int) {
                Log.d(TAG, "Scan failed, error code: $errorCode")
            }
        }

        if (scanner != null) {
            scanner.startScan(null, scanSettings, scanCallback)
            Log.d(TAG, "scan started")
        } else {
            Log.e(TAG, "could not get scanner object")
        }
    }

在清单中我有这些权限:

<uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

已授予每个权限。 但是当我试图搜索时,我找不到任何移动设备。我可以在我的厨房里找到两台电视、智能时钟,甚至水壶。但是没有移动 phones(两个启用了蓝牙搜索)。我可以从 OS 中找到这些 phone,但不能从我的代码中找到。为什么?请帮忙!

这是我目前正在处理的项目中的一些 Kotlin 代码,它向您展示了如何在 phone.

上迭代配对的 BT 设备
private fun GetPairedDevices(btAdapter: BluetoothAdapter): MutableSet<BluetoothDevice> {
        val pairedDevices = btAdapter?.bondedDevices
        // If there are paired devices
        Log.i("FirstFrag", "checking paired devices")
        if (pairedDevices != null) {
            Log.i("FirstFrag", "pairedDevices NOT null")
            if (pairedDevices.size > 0) {
                Log.i("FirstFrag", pairedDevices.size.toString())
                for (device in pairedDevices) {
                    // Add the name and address to an array adapter to show in a ListView
                    adapter!!.add(device.name) // + "\n" + device.getAddress());
                }
                adapter!!.notifyDataSetChanged()
            }
        }
        return pairedDevices
    }

函数调用如下所示:

btAdapter = BluetoothAdapter.getDefaultAdapter()    
pairedDevices = GetPairedDevices(btAdapter)

如果你想看到这个工作非常快,那么 get my entire project from my github repo 和 运行 它。

当您 运行 应用程序做的第一件事是获取配对设备并填写下拉列表。你会看到你的 phone 出现在那里。

此项目用于连接 HC-05 设备,但它会找到所有已配对的设备。我刚刚用我的两个 android phone 试了一下,我的 phone 出现在下拉列表中。

一些附加信息

I 运行 此代码来自 onViewCreated() 方法中的一个片段。 adapter 只是一个 ArrayAdapter<String>?,我用它在 Spinner.

中显示 device.name

如果您想快速尝试该方法,只需删除适配器内容并添加 Log.i("FirstFrag", device.name) 并观察您的 logcat。