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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:54:01