You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BLUETOOTH_CONNECT权限返回false,需重启应用的解决办法

解决方案

问题根源

连续调用单个权限的launch方法会引发异步回调冲突,导致系统权限状态无法及时同步,进而出现授权后权限校验仍返回false的情况;同时单个权限请求无法批量处理多个权限,也是问题的诱因之一。

修复步骤

  1. 切换为多权限请求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 = "部分蓝牙权限未授予"
        }
    }
    
  2. 批量发起权限请求
    通过数组传递多个权限,避免连续调用launch:

    multiplePermissionLauncher.launch(
        arrayOf(
            Manifest.permission.BLUETOOTH_CONNECT,
            Manifest.permission.BLUETOOTH_SCAN
        )
    )
    
  3. 实时校验权限状态
    在执行蓝牙发现前,通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 18:55:03