BLUETOOTH_CONNECT权限返回false,需重启应用的解决办法
解决方案
问题根源
连续调用单个权限的launch方法会引发异步回调冲突,导致系统权限状态无法及时同步,进而出现授权后权限校验仍返回false的情况;同时单个权限请求无法批量处理多个权限,也是问题的诱因之一。
修复步骤
切换为多权限请求Launcher
将原有的RequestPermission替换为RequestMultiplePermissions,实现一次性请求多个蓝牙权限:val multiplePermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions -> val connectGranted = permissions[Manifest.permission.BLUETOOTH_CONNECT] ?: false val scanGranted = permissions[Manifest.permission.BLUETOOTH_SCAN] ?: false if (connectGranted && scanGranted) { textView1.text = "所有蓝牙权限已授予" // 在此处直接执行蓝牙发现操作,此时权限状态已同步完成 startBluetoothDiscovery() } else { textView1.text = "部分蓝牙权限未授予" } }批量发起权限请求
通过数组传递多个权限,避免连续调用launch:multiplePermissionLauncher.launch( arrayOf( Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN ) )实时校验权限状态
在执行蓝牙发现前,通过checkSelfPermission实时确认权限,避免依赖缓存状态:private fun startBluetoothDiscovery() { val hasConnectPerm = ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_GRANTED val hasScanPerm = ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_SCAN) == PackageManager.PERMISSION_GRANTED if (hasConnectPerm && hasScanPerm) { bluetoothAdapter?.startDiscovery() } else { textView1.text = "权限未完全获取,请重新授权" } }
关键说明
- 多权限请求的回调会一次性返回所有权限的授予状态,此时系统权限状态已完成同步,不会出现校验偏差。
- 必须等待权限请求回调确认授权后,再执行依赖权限的操作,避免提前触发导致的权限校验错误。
内容的提问来源于stack exchange,提问作者Zero_CoolV2.0
相关产品推荐
相关产品推荐

