Android Kotlin中获取蓝牙配对设备名称:d.getName()无法使用如何解决?
解决Kotlin中获取蓝牙配对设备名称的问题
Hey,我来帮你搞定这个问题!你的代码里其实藏着两个小问题,咱们一步步来解决:
首先,修正遍历配对设备的错误
你写的for (d in listOfNotNull(pairedDevices))这里有问题——pairedDevices本身是Set<BluetoothDevice>?类型,listOfNotNull会把整个Set当成单个元素放进列表里,所以循环里的d其实是个集合,根本不是单个蓝牙设备,自然调用不了getName()方法啦!
正确的遍历方式应该是直接遍历pairedDevices这个集合(先判断它不为null)。
然后,正确获取设备名称
另外,从Android 12(API 31)开始,BluetoothDevice.getName()方法已经被弃用了,Kotlin里更推荐用属性访问device.name,而且还要注意权限问题:
1. 确保权限配置
在你的AndroidManifest.xml里添加对应权限:
<!-- Android 11及以下版本需要的权限 --> <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" /> <!-- Android 12+必须的权限 --> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
注意:Android 12+的BLUETOOTH_CONNECT是危险权限,需要在运行时动态申请,不能只在Manifest里声明哦!
2. 修正后的完整代码
// 获取配对设备集合 val pairedDevices = mBluetoothAdapter?.bondedDevices // 遍历每个设备,添加名称到blueArray pairedDevices?.forEach { device -> // 处理名称可能为null的情况(比如权限不足) val deviceName = device.name ?: "未知设备" blueArray?.add(deviceName) }
或者用你习惯的for循环写法:
if (pairedDevices != null) { for (device in pairedDevices) { val deviceName = device.name ?: "未知设备" blueArray?.add(deviceName) } }
为什么之前的getName()不行?
- 除了遍历错误外,Android 12+如果没有
BLUETOOTH_CONNECT权限,调用getName()或者访问name属性都会返回null; - Kotlin里更推荐使用属性访问(
device.name)而不是Java风格的getter方法,这也是官方推荐的写法。
内容的提问来源于stack exchange,提问作者Rishabh sharma
相关产品推荐
相关产品推荐

