gpt4 book ai didi

android - 即使在 Android N 上,如何获取应用程序(或全部)的当前网络使用情况?

转载 作者:IT老高 更新时间:2023-10-28 23:40:47 27 4
gpt4 key购买 nike

正如标题所说。我想知道特定应用程序在特定时间每秒使用多少字节。

也许我可以使用“netstat”命令?但如果是这样,我如何将其过滤到特定的应用程序/进程?

我是否还需要获得一些权限才能这样做?

目前人们说要使用 TrafficStats.getUidRxBytes(packageInfo.uid) ,但是,从这里:https://developer.android.com/reference/android/net/TrafficStats.html#getUidRxBytes(int) ,它说它不受 N 支持,我应该改用 NetworkStatsManager 。有什么例子可以使用吗?

也许是一个合并的解决方案?

编辑:我尝试在 Android N 上使用 NetworkStatsManager,但失败了。我找不到任何关于如何使用它的示例,并且所有关于它的 stackOverflow 问题在不能很好地使用方面都是相似的。请,如果有人知道如何使用它,请写下来。

最佳答案

NetworkStats的使用并不复杂。

设备 API 级别必须至少为 23。以下是开始使用 NetworkStatsManager

之前需要执行的一些步骤
  1. AndroidManifest.xml中声明所需的权限:

    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission
    android:name="android.permission.PACKAGE_USAGE_STATS"
    tools:ignore="ProtectedPermissions"/>
  2. Activity

    中请求权限

    android.permission.PACKAGE_USAGE_STATS 不是普通权限,不能简单请求。为了检查是否已授予权限,请检查:

    AppOpsManager appOps = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
    int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,
    android.os.Process.myUid(), getPackageName());
    if (mode == AppOpsManager.MODE_ALLOWED) {
    return true;
    }

    要请求此权限,只需调用 Intent:

    Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
    startActivity(intent);

    还需要另一个权限:Manifest.permission.READ_PHONE_STATE。但是,这是正常权限,因此可以是 requested as any other permission

  3. 使用NetworkStatsManager:

    要获取它的引用,请调用:

    NetworkStatsManager networkStatsManager = (NetworkStatsManager) getApplicationContext().getSystemService(Context.NETWORK_STATS_SERVICE);

    NetworkStatsManager 检索到的所有内容都打包到 Buckets 中.这只是一个简单的 POJO,用于保存数据。

    全局:

    要获得 WiFi 的总体使用情况:

    NetworkStats.Bucket bucket;
    try {
    bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_WIFI,
    "",
    0,
    System.currentTimeMillis());
    } catch (RemoteException e) {
    return -1;
    }

    NetworkStats.Bucket中,可以调用两个方法来获取使用情况(以Bps为单位):

    bucket.getRxBytes();
    bucket.getTxBytes();

    获取移动网络的数据比较困难。为了获取 Bucket 调用:

    public long getAllRxBytesMobile(Context context) {
    NetworkStats.Bucket bucket;
    try {
    bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE,
    getSubscriberId(context, ConnectivityManager.TYPE_MOBILE),
    0,
    System.currentTimeMillis());
    } catch (RemoteException e) {
    return -1;
    }
    return bucket.getRxBytes();
    }

    //Here Manifest.permission.READ_PHONE_STATS is needed
    private String getSubscriberId(Context context, int networkType) {
    if (ConnectivityManager.TYPE_MOBILE == networkType) {
    TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    return tm.getSubscriberId();
    }
    return "";
    }

    应用:

    要获取特定应用程序的数据,请阅读 queryDetailsForUID 的文档.

    获取WiFi的包使用情况:

    NetworkStats networkStats = null;
    try {
    networkStats = networkStatsManager.queryDetailsForUid(
    ConnectivityManager.TYPE_WIFI,
    "",
    0,
    System.currentTimeMillis(),
    packageUid);
    } catch (RemoteException e) {
    return -1;
    }
    NetworkStats.Bucket bucket = new NetworkStats.Bucket();
    networkStats.getNextBucket(bucket);

    要获取 Mobile 的包使用情况:

    NetworkStats networkStats = null;
    try {
    networkStats = networkStatsManager.queryDetailsForUid(
    ConnectivityManager.TYPE_MOBILE,
    getSubscriberId(context, ConnectivityManager.TYPE_MOBILE),
    0,
    System.currentTimeMillis(),
    packageUid);
    } catch (RemoteException e) {
    return -1;
    }
    NetworkStats.Bucket bucket = new NetworkStats.Bucket();
    networkStats.getNextBucket(bucket);

    不幸的是,根据 this piece of code只有 ConnectivityManager.TYPE_MOBILEConnectivityManager.TYPE_WIFI 才能获取统计信息。

制作 sample Github repo演示用法。

关于android - 即使在 Android N 上,如何获取应用程序(或全部)的当前网络使用情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39314314/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com