android 流量统计

说明:这里流量统计用到的方法只支持在6.0以上系统运行,还有用到的一个权限只提供给系统应用使用,这两条不能满足,这篇文章基本也没什么参考价值,请移步其他解决方式。


关于流量统计,早期android系统做的不太完善,手机关机所有的统计流量就会清零,数据都是从开机到当前时间的数据,没有具体的一段时间内的流量统计。

网上一些方法基本都是读取流量数据然后自己建立数据库保存数据。但是一些清理程序经常把我们做的统计程序清理掉,从android 4.3以后,一些方法提升应用程序在后台运行的优先级而不被kill的方法也基本失效,这样程序统计的数据可信度基本为零了。。。。


从android 6.0以后,android又提供一个强大的流量统计工具:NetworkStatsManager

唯一的缺陷是只提供给系统应用的,还好公司是某款手机研发生产商,应用程序都提供平台签名才可以使用这种方法,希望google早点放开权限。。。


关于该类官网介绍如下:


简单翻译就是:该类提供一个网络使用的历史以及数据统计,数据被封装在一个称为“Buckets”的时间离散集合中。

该类提供的一些方法:


从方法说明中可以看到,可以根据应用程序uid统计流量信息,还可以统计具体时间段的流量使用情况,本人测试,关机并不会影响统计结果。


不多说其他的了,直接上程序:(仅仅统计功能实现函数,参考即可)

需要添加的权限:

<!--该权限需要系统应用才能使用-->

<uses-permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY"/>
 
显示数据的函数:
 
@TargetApi(23)
private void showData(int type) {
   Log.e("showData", "sdk:" + Integer.toString(Build.VERSION.SDK_INT));
   if (23 > Build.VERSION.SDK_INT) {
      stringBuffer.append("设备不支持统计,请使用安卓6.0以上系统");
      tvshowdata.setText(stringBuffer.toString());
      return;
   }
   try {
//设置统计时间
      Calendar calendar = Calendar.getInstance();
      calendar.set(Calendar.HOUR_OF_DAY, 0);
      calendar.set(Calendar.MINUTE, 0);
      calendar.set(Calendar.SECOND, 0);
      etime = System.currentTimeMillis();
      stime = calendar.getTimeInMillis();
      calendar.clear();
NetworkStatsManager nsm = (NetworkStatsManager) MainActivity.this.getSystemService(Context.NETWORK_STATS_SERVICE); PackageManager packageManager = getPackageManager(); List<PackageInfo> packageInfos = packageManager.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES); for (PackageInfo p : packageInfos) { if ("com.huawei.health".equals(p.packageName)) { healthuid = p.applicationInfo.uid; showappicon.setImageDrawable((Drawable) p.applicationInfo.loadIcon(getPackageManager())); showappname.setText(p.applicationInfo.loadLabel(getPackageManager()).toString()); } Log.e("安装包:", p.packageName + " uid:" + p.applicationInfo.uid); } stringBuffer.delete(0, stringBuffer.length()); NetworkStats networkStats = nsm.querySummary(type, null, stime, etime); ArrayList<NetworkStats.Bucket> bucketList = new ArrayList<NetworkStats.Bucket>(); while (networkStats.hasNextBucket()) { NetworkStats.Bucket bucket = new NetworkStats.Bucket(); if (networkStats.getNextBucket(bucket)) { Log.e("bucket:", bucket.toString() + " uid:" + bucket.getUid()); if (bucket.getUid() == healthuid) { bucketList.add(bucket); } } } stringBuffer.append("详细信息:\r\n\r\n"); for (int i = 0; i < bucketList.size(); i++) { rxbytes += bucketList.get(i).getRxBytes(); txbytes += bucketList.get(i).getTxBytes(); stringBuffer.append("uid:" + Integer.toString(healthuid) + "\r\n 接收: " + Long.toString(bucketList.get(i).getRxBytes() / 1000) + "kb \r\n 发送:" + Long.toString(bucketList.get(i).getTxBytes() / 1000) + "kb\r\n\r\n"); } if (txbytes > 1048576) { showTx.setText("Tx: \r\n" + log.df((((double) txbytes) / 1048576.0), "0.00") + " Mb"); } else { showTx.setText("Tx: \r\n" + Long.toString(txbytes / 1024) + " Kb"); } if (rxbytes > 1048576) { showRx.setText("Rx: \r\n" + log.df((((double) rxbytes) / 1048576.0), "0.00") + " Mb"); } else { showRx.setText("Rx: \r\n" + Long.toString(rxbytes / 1024) + " Kb"); } if ((rxbytes + txbytes)> 1048576) { showtotal.setText("Total: \r\n" + log.df((((double) (rxbytes + txbytes)) / 1048576.0), "0.00") + " Mb"); } else { showtotal.setText("Total: \r\n" + Long.toString((rxbytes + txbytes) / 1024) + " Kb"); } tvshowdata.setText(stringBuffer.toString()); rxbytes = 0; txbytes = 0; } catch (RemoteException e) { log.e(tag,"出现异常RemoteException",isshowlog); e.printStackTrace(); }catch (Exception e1){ log.e(tag,"出现异常Exception",isshowlog); e1.printStackTrace(); }}
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值