UWP应用读取AirPods Pro电池时触发E_ACCESSDENIED权限错误求助
解决UWP连接AirPods Pro RFCOMM服务时的E_ACCESSDENIED错误
你碰到的这个Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))错误,核心原因是UWP的蓝牙权限声明不够精准,加上AirPods的蓝牙服务特性需要特定的权限配置才能访问。结合你提供的代码和manifest修改记录,我整理了几个关键的修复步骤:
1. 完善Package.appxmanifest的权限配置
UWP的沙箱机制要求你精准声明所有要访问的蓝牙服务类型,只泛泛声明bluetooth.rfcomm是不够的。你需要补充以下配置:
- 添加
bluetooth.genericAttributeProfile权限:AirPods的电量数据主要通过GATT服务传输,即使你用RFCOMM,也可能依赖这个权限 - 确保RFCOMM服务ID的声明完全匹配你要访问的服务
完整的Capabilities配置应该是这样的:
<Capabilities> <Capability Name="internetClient"/> <Capability Name="privateNetworkClientServer"/> <!-- 蓝牙基础权限 --> <DeviceCapability Name="bluetooth"/> <DeviceCapability Name="bluetooth.genericAttributeProfile"/> <!-- 精准声明RFCOMM服务ID --> <DeviceCapability Name="bluetooth.rfcomm"> <Device Id="any"> <Function Type="serviceId:0000111e-0000-1000-8000-00805f9b34fb" /> </Device> </DeviceCapability> </Capabilities>
2. 确保设备处于有效连接状态
UWP的BluetoothDevice.FromIdAsync方法虽然能获取已配对设备,但如果设备只是配对未连接,后续的服务访问会失败。在代码里增加连接状态检查:
BluetoothDevice bluetoothDevice = await BluetoothDevice.FromIdAsync(connectedDevice.Id); if (bluetoothDevice.ConnectionStatus != BluetoothConnectionStatus.Connected) { // 这里可以提示用户确保AirPods处于连接状态 continue; }
3. 代码调试与优化
你的空catch块会掩盖关键错误信息,建议修改成输出异常详情,方便排查:
try { var socket = new StreamSocket(); await socket.ConnectAsync(service.ConnectionHostName, service.ConnectionServiceName); // 连接成功后的逻辑 } catch (Exception ex) { Debug.WriteLine($"连接错误:{ex.Message},HRESULT:{ex.HResult:X8}"); }
另外,AirPods的电量数据其实更适合通过GATT电池服务获取,而不是RFCOMM。如果你的目标是读取电量,建议尝试访问GATT服务0000180f-0000-1000-8000-00805f9b34fb,这个方式更稳定,权限配置也更简单。
最后提醒
UWP的蓝牙权限在不同Windows版本上可能有细微差异,确保你的测试设备运行的是较新版本的Windows 10/11,同时在开发模式下调试时,允许应用访问蓝牙设备。
内容的提问来源于stack exchange,提问作者pantonis
相关产品推荐
相关产品推荐

