首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用TrafficeStats和NetworkStatsManager的数据使用状态

使用TrafficeStats和NetworkStatsManager的数据使用状态
EN

Stack Overflow用户
提问于 2017-01-20 10:56:59
回答 1查看 1.5K关注 0票数 1

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

我收到了一些关于使用NetworkStatsManager类进行API23及更高版本的文章,有些帖子提到这需要系统级的权限。

我也看过NetworkStatsManager的文档。

有谁能成功地实现NetworkStatsManager的全部和应用的数据使用?

如果有人真的帮忙的话,请提前感谢。

EN

回答 1

Stack Overflow用户

发布于 2019-03-30 01:21:19

因此,我将同时展示这两种方法,即使用NetworkStatsManagerTrafficeStats

我将获得UID的所有应用程序安装在电话中,并使用这两种方式的数据使用。

您可以参考这个例子作为一个很好的例子,https://github.com/RobertZagorski/NetworkStats前5种方法是从他的代码中摘取的。

代码语言:javascript
复制
//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)));

  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41761966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档