首页 > 解决方案 > 应用找不到手机蓝牙设备

问题描述

我找不到任何带有蓝牙搜索功能的手机(我的意思是可用的未配对设备)。我有这个代码来搜索设备:

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" />

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

标签: androidbluetooth-lowenergy

解决方案


这是我现在正在处理的项目中的一些 Kotlin 代码,它向您展示了如何在手机上迭代配对的 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)

如果您想快速查看这项工作,请从我的 github 存储库中获取我的整个项目并运行它。

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

该项目用于连接到 HC-05 设备,但它会找到所有已配对的设备。我刚刚用我的两部安卓手机试了一下,我的手机出现在下拉列表中。

一些附加信息

我从 onViewCreated() 方法中的片段运行此代码。这adapter只是ArrayAdapter<String>?我用来在 a 中显示的device.namea Spinner

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


推荐阅读