android - 使用 TrafficeStats 和 NetworkStatsManager 的数据使用统计

标签 android

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

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

我也浏览了 NetworkStatsManager 的文档。

任何人都可以成功实现 NetworkStatsManager 以获取总数据使用量和应用程序数据使用量吗?

如果有人真正提供帮助,请提前致谢。

最佳答案

所以我将同时展示使用 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)));

  }
}

关于android - 使用 TrafficeStats 和 NetworkStatsManager 的数据使用统计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41761966/

相关文章:

java - Android MediaStore 缩略图不存在

android - Robospice+改造后台 Action 序列

android - 无法在我的 android 应用程序中使用 facebook sdk 3.0 获取基本信息

android - 仅为特定布局设置 NoActionBar 主题

android - 支持 MapFragment 而不是 MapFragment

java - 有没有办法从android中的firestore中的数组获取数据

java - 注解处理第三方库

java - 无法进行 google 登录(返回用户为空)

android - 从 WIN 10 切换到 Ubuntu 后,Flutter 应用程序无法运行

java - Android中周期性任务的实现