android - 应用找不到手机蓝牙设备
问题描述
我找不到任何带有蓝牙搜索功能的手机(我的意思是可用的未配对设备)。我有这个代码来搜索设备:
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" />
每个权限都被授予。但是当我试图搜索时,我找不到任何移动设备。我可以在厨房里找到两台电视、智能时钟,甚至水壶。但没有手机(两个启用蓝牙搜索)。我可以从操作系统中找到这些手机,但不能从我的代码中找到。为什么?请帮忙!
解决方案
这是我现在正在处理的项目中的一些 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.name
a Spinner
。
如果您想快速尝试该方法,只需删除适配器并添加一个Log.i("FirstFrag", device.name)
并观察您的 logcat。
推荐阅读
- java - 使用 ObjectBox 存储一对多关系列表?
- python - 为什么自适应阈值图像小于原始图像?
- azure-devops - Azure DevOps 看板
- javascript - 对象标签数据属性与 iframe src 和表单提交
- javascript - 如何让确认框与 jsp 一起使用?
- mysql - 需要一个更新查询来根据目标表的列将分数从参考表更新到目标表
- java - 我的 java“文件字数统计”程序不准确
- haskell - 我很困惑为什么这种合并排序的实现不起作用?
- javascript - 将表单输入值转换为 JSON
- python-3.x - 从 Trakt.tv Watchlist 获取数据的非常简单的“随机电影 Windows 应用程序”