【问题标题】:Data usage stats using TrafficeStats and NetworkStatsManager使用 TrafficeStats 和 NetworkStatsManager 的数据使用统计
【发布时间】:2017-01-20 10:56:59
【问题描述】:

我开发了 Android 应用程序,它使用 TrafficStats API 在后台服务中获取所有已安装应用程序的数据使用统计信息。本周早些时候,在三星 Galaxy S5 上,在软件更新(即 6.0.1)之后,TrafficStats 总是为每个 uid 返回 0。相同的应用程序在 HUAWEI KIW-L21 和 OS 6.0.1 上完美运行。

我收到了一些使用 API 23 及更高版本的 NetworkStatsManager 类的帖子,一些帖子提到这需要系统级权限。

我也浏览了 NetworkStatsManager 的文档。

任何人都可以成功实施 NetworkStatsManager 以用于总数据和应用程序数据使用吗?

如果有人真的提供帮助,请提前感谢。

【问题讨论】:

    标签: android


    【解决方案1】:

    所以我将一起展示使用 TrafficeStatsNetworkStatsManager

    的两种方法

    我将获取手机中安装的所有应用程序的 UID,并使用两种方式来使用数据。

    你可以参考这个作为一个很好的例子https://github.com/RobertZagorski/NetworkStats 前 5 个方法取自他的代码。

    //when using NetworkStatsManager you need the subscriber id 
    private String getSubscriberId(Context context, int networkType) {
      if (ConnectivityManager.TYPE_MOBILE == networkType) {
         TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
         return tm.getSubscriberId();
         }
       return "";
    }
    
    
    // to get mobile data recived
    public long getPackageRxBytesMobile(Context context,NetworkStatsManager networkStatsManager,int packageUid) {
      NetworkStats networkStats = null;
      networkStats = networkStatsManager.queryDetailsForUid(
                    ConnectivityManager.TYPE_MOBILE,
                    getSubscriberId(context, ConnectivityManager.TYPE_MOBILE),
                    0,
                    System.currentTimeMillis(),
                    packageUid);
      NetworkStats.Bucket bucket = new NetworkStats.Bucket();
            networkStats.getNextBucket(bucket);
            networkStats.getNextBucket(bucket);
            return bucket.getRxBytes();
      }
    
    
    // to get mobile data transmitted 
    public long getPackageTxBytesMobile(Context context,NetworkStatsManager networkStatsManager,int packageUid) {
      NetworkStats networkStats = null;
      networkStats = networkStatsManager.queryDetailsForUid(
                    ConnectivityManager.TYPE_MOBILE,
                    getSubscriberId(context, ConnectivityManager.TYPE_MOBILE),
                    0,
                    System.currentTimeMillis(),
                    packageUid);
      NetworkStats.Bucket bucket = new NetworkStats.Bucket();
      networkStats.getNextBucket(bucket);
      return bucket.getTxBytes();
    }
    
    
    // to get wifi data received 
    public long getPackageRxBytesWifi(NetworkStatsManager networkStatsManager,int packageUid) {
      NetworkStats networkStats = null;
      networkStats = networkStatsManager.queryDetailsForUid(
                    ConnectivityManager.TYPE_WIFI,
                    "",
                    0,
                    System.currentTimeMillis(),
                    packageUid);
      NetworkStats.Bucket bucket = new NetworkStats.Bucket();
      networkStats.getNextBucket(bucket);
      return bucket.getRxBytes();
    }
    
    
    // to get wifi data transmitted 
    public long getPackageTxBytesWifi(NetworkStatsManager networkStatsManager,int packageUid) {
      NetworkStats networkStats = null;
      networkStats = networkStatsManager.queryDetailsForUid(
                    ConnectivityManager.TYPE_WIFI,
                    "",
                    0,
                    System.currentTimeMillis(),
                    packageUid);
      NetworkStats.Bucket bucket = new NetworkStats.Bucket();
      networkStats.getNextBucket(bucket);
      return bucket.getTxBytes();
    }
    
    
    // print to log all the data usage value per application
    public void printAllDataUsage(){
     PackageManager pm = getPackageManager();
     // get all the applications in the phone
     List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
    
     NetworkStatsManager networkStatsManager = (NetworkStatsManager) getApplicationContext().getSystemService(Context.NETWORK_STATS_SERVICE);
    
     for (ApplicationInfo packageInfo : packages) {
         Log.d("MYLOG", String.valueOf(packageInfo.uid));
         Log.d("MYLOG", String.valueOf(packageInfo.name));
         Log.d("MYLOG", String.valueOf(packageInfo.packageName));
    
         // get data usage from trafficStats
         Log.d("MYLOG", String.valueOf(TrafficStats.getUidRxBytes(packageInfo.uid)));
         Log.d("MYLOG", String.valueOf(TrafficStats.getUidTxBytes(packageInfo.uid)));
    
         // get data usage from networkStatsManager using mobile
         Log.d("MYLOG", String.valueOf(getPackageRxBytesMobile(this,networkStatsManager,packageInfo.uid)));
         Log.d("MYLOG", String.valueOf(getPackageTxBytesMobile(this,networkStatsManager,packageInfo.uid)));
    
         // get data usage from networkStatsManager using wifi
         Log.d("MYLOG", String.valueOf(getPackageRxBytesWifi(networkStatsManager,packageInfo.uid)));
         Log.d("MYLOG", String.valueOf(getPackageTxBytesWifi(networkStatsManager,packageInfo.uid)));
    
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-15
      相关资源
      最近更新 更多