Android 13三星SM-G998U设备getBondedDevices()无法获取已配对蓝牙设备
问题原因分析及解决方案
核心问题:权限检查逻辑错误
你的代码中checkBluetoothPermission函数的权限判断逻辑存在错误,这是导致Android 13三星设备无法获取配对设备的主要原因:
- 在Android 13(API 33+)中,获取已配对蓝牙设备必须持有
BLUETOOTH_CONNECT权限,但你的函数在权限未授予时,错误地返回Build.VERSION.SDK_INT < Build.VERSION_CODES.S(即Android 13+设备权限未授予时返回false)。 - 同时
getBondedDevices中的判断条件!checkBluetoothPermission(mContext) && !isBluetoothEnabled意味着:即使权限未授予但蓝牙已开启,代码仍会执行获取配对设备的逻辑。而Android 13+系统在没有BLUETOOTH_CONNECT权限时,调用bondedDevices会直接返回空列表。
此外,部分三星Android 13设备对蓝牙权限的管控更严格,权限生效可能存在延迟,或需要用户在应用信息中确认权限的具体使用范围。缓存导致的概率极低,但也可作为后续排查方向。
修复步骤
1. 修正权限检查逻辑
重写权限判断函数,正确匹配不同Android版本的权限要求:
fun checkBluetoothPermission(context: Context): Boolean { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { // Android 13+ 仅需检查 BLUETOOTH_CONNECT 权限 ActivityCompat.checkSelfPermission( context, Manifest.permission.BLUETOOTH_CONNECT ) == PackageManager.PERMISSION_GRANTED } else { // Android 12及以下,检查旧版蓝牙权限 ActivityCompat.checkSelfPermission( context, Manifest.permission.BLUETOOTH ) == PackageManager.PERMISSION_GRANTED } }
同时修改getBondedDevices的判断逻辑,只要权限不满足或蓝牙未开启,就直接返回:
fun getBondedDevices(){ if (!checkBluetoothPermission(mContext) || !isBluetoothEnabled) { return } val bondedDevice = mBluetoothAdapter?.bondedDevices // 可添加日志输出,确认设备列表情况 // Log.d("Bluetooth", "Bonded devices count: ${bondedDevice?.size ?: 0}") }
2. 确保权限声明与动态申请正确
在AndroidManifest.xml中添加对应权限声明:
<!-- Android 13+ 蓝牙连接权限 --> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <!-- Android 12及以下蓝牙权限,限制仅在旧版本生效 --> <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="32" />
在应用运行时,针对Android 13+设备动态申请BLUETOOTH_CONNECT权限,确保用户授予权限后再执行获取配对设备的逻辑。
3. 排查缓存/系统问题(权限正常后仍异常时)
- 清除应用缓存:进入设备设置 → 应用管理 → 你的应用 → 存储 → 清除缓存。
- 重启设备,或在蓝牙设置中取消配对目标设备后重新配对,再尝试获取列表。
内容的提问来源于stack exchange,提问作者Maradiya Krupa
相关产品推荐
相关产品推荐

