应用程序找不到手机蓝牙设备
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。
我无法通过蓝牙搜索找到任何手机 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。