UWP/C#如何按网络类型及应用获取数据使用量
实现UWP应用数据消耗分析的方法
嘿,刚好我之前研究过UWP里获取数据使用量的方法,来给你一步步拆解,满足你按网络类型统计、获取单应用详情的需求!
一、先搞定必要的权限
要访问网络使用数据,你得先在Package.appxmanifest里声明对应的功能,不然API会直接报错。打开你的清单文件,添加以下内容:
<Capabilities> <!-- 基础网络访问权限 --> <Capability Name="internetClient" /> <!-- 获取网络状态权限 --> <Capability Name="networkState" /> <!-- 获取应用诊断数据的权限(获取单应用数据必须) --> <uap:Capability Name="appDiagnostics" /> </Capabilities>
⚠️ 注意:appDiagnostics权限比较特殊,普通商店应用可能无法通过审核,只有企业部署或开发环境下的应用能正常使用。而且用户需要在系统设置里给你的应用授权:设置 → 隐私 → 诊断和反馈 → 允许应用访问诊断数据,或者在应用的高级权限里开启“诊断”权限。
二、按网络类型获取数据使用量
我们可以用Windows.Networking.Connectivity命名空间下的DataUsage类,指定时间范围和粒度来获取不同网络类型的使用数据。
代码示例
using Windows.Networking.Connectivity; using System; using System.Threading.Tasks; public async Task FetchDataUsageByNetworkType() { // 定义统计时间范围,这里取过去30天的数据 var startTime = DateTimeOffset.Now.Subtract(TimeSpan.FromDays(30)); var endTime = DateTimeOffset.Now; // 获取所有网络的使用数据,粒度按天统计 var networkUsages = await DataUsage.GetNetworkUsageAsync( startTime, endTime, DataUsageGranularity.PerDay, NetworkUsageStates.All); foreach (var usage in networkUsages) { // 识别网络类型(WiFi/蜂窝/以太网等) var networkType = GetNetworkType(usage.NetworkAdapter); // 格式化字节数为易读格式 var sent = FormatByteSize(usage.BytesSent); var received = FormatByteSize(usage.BytesReceived); Console.WriteLine($"网络类型: {networkType}"); Console.WriteLine($"发送数据: {sent}"); Console.WriteLine($"接收数据: {received}"); Console.WriteLine("---"); } } private string GetNetworkType(NetworkAdapter adapter) { switch (adapter.NetworkAdapterType) { case NetworkAdapterType.WiFi: return "WiFi"; case NetworkAdapterType.Cellular: // 判断是否处于漫游状态 var profile = adapter.GetConnectionProfile(); if (profile?.RoamingStatus == RoamingStatus.Roaming) { return "蜂窝网络(漫游)"; } return "蜂窝网络"; case NetworkAdapterType.Ethernet: return "以太网"; default: return "其他网络"; } } private string FormatByteSize(ulong bytes) { var suffixes = new[] { "B", "KB", "MB", "GB", "TB" }; var index = 0; double size = bytes; while (size >= 1024 && index < suffixes.Length - 1) { size /= 1024; index++; } return $"{size:F2} {suffixes[index]}"; }
这段代码会遍历所有网络适配器,根据类型区分WiFi、蜂窝(含漫游)等,并统计对应时间段的收发数据量。
三、获取已安装应用的详细数据使用信息
要获取单应用的数据使用情况,我们用DataUsage.GetAppNetworkUsageAsync方法,它会返回每个应用的网络使用记录。
代码示例
using Windows.ApplicationModel; using Windows.Networking.Connectivity; using System; using System.Threading.Tasks; public async Task FetchAppDataUsageDetails() { var startTime = DateTimeOffset.Now.Subtract(TimeSpan.FromDays(30)); var endTime = DateTimeOffset.Now; try { // 获取所有应用的网络使用数据 var appUsages = await DataUsage.GetAppNetworkUsageAsync( startTime, endTime, DataUsageGranularity.PerDay, NetworkUsageStates.All); foreach (var appUsage in appUsages) { // 通过AppId获取对应的应用包信息 var package = await Package.GetPackageByIdAsync(appUsage.AppId); var appName = string.IsNullOrEmpty(package.DisplayName) ? package.Id.Name : package.DisplayName; // 统计该应用的总收发数据 ulong totalSent = 0; ulong totalReceived = 0; foreach (var usage in appUsage.NetworkUsage) { totalSent += usage.BytesSent; totalReceived += usage.BytesReceived; } Console.WriteLine($"应用名称: {appName}"); Console.WriteLine($"应用ID: {appUsage.AppId}"); Console.WriteLine($"总发送数据: {FormatByteSize(totalSent)}"); Console.WriteLine($"总接收数据: {FormatByteSize(totalReceived)}"); Console.WriteLine("---"); } } catch (UnauthorizedAccessException) { // 权限不足时的提示 Console.WriteLine("权限不足!请在系统设置中开启应用的诊断数据访问权限。"); } }
⚠️ 注意:如果没有appDiagnostics权限或者用户未授权,这段代码会抛出UnauthorizedAccessException,记得做好异常处理。
一些额外的注意事项
- 数据统计范围:系统最多保存过去60天的网络使用数据,所以你不能获取更早的记录。
- 数据延迟:系统的数据统计不是实时的,可能有1-2小时的延迟。
- 权限限制:普通商店应用无法获取
appDiagnostics权限,如果你是开发自用或企业部署的应用,这个方法没问题;如果要上架商店,可改用DataUsage.GetSelfNetworkUsageAsync获取当前应用自身的数据,不需要额外权限。
内容的提问来源于stack exchange,提问作者Gold.strike
相关产品推荐
相关产品推荐

