C++ WinRT调用BluetoothLEDevice::FromIdAsync出现访问被拒绝错误
解决C++ WinRT蓝牙LE连接80070005访问被拒绝问题
核心修复步骤
- 补全应用清单的蓝牙权限声明
新建项目默认不会自动添加蓝牙相关设备能力,这是导致访问被拒绝的最常见原因。手动编辑Package.appxmanifest文件,在<Capabilities>节点下添加以下配置:
<DeviceCapability Name="bluetooth" /> <DeviceCapability Name="bluetooth.genericAttributeProfile"> <Device Id="any"> <Function Type="name:genericAttributeProfile" /> </Device> </DeviceCapability>
该配置声明了应用对蓝牙及GATT服务的访问权限,与微软示例项目的清单配置保持一致。
- 核对项目WinRT版本兼容性
确保项目的平台版本设置支持蓝牙LE API的完整功能:
- 右键项目 → 属性 → 通用Windows → 目标平台版本选择Windows 10 1709(10.0.16299.0)及以上
- 最低版本建议不低于Windows 10 1607(10.0.14393.0),避免API兼容性问题
- 优化异常处理排查问题
在现有代码中补充对ERROR_ACCESS_DENIED的捕获,快速定位权限类问题:
catch (hresult_error & ex) { if (ex.to_abi() == HRESULT_FROM_WIN32(ERROR_DEVICE_NOT_AVAILABLE)) { LogOnConsole(L"Bluetooth radio is not on."); } else if (ex.to_abi() == HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED)) { LogOnConsole(L"访问被拒绝,请检查应用权限配置或系统权限设置。"); } else { LogOnConsole(L"连接错误: " + ex.message()); } }
- 验证设备ID与系统权限
- 确认使用的设备ID为当前可用的蓝牙LE设备ID,可通过
DeviceInformation.FindAllAsync接口扫描获取正确ID - 检查系统设置中应用的蓝牙权限是否开启:进入Windows设置 → 应用 → 找到目标应用 → 权限 → 确保蓝牙权限已允许
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

