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 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 bucketList = new ArrayList(); 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(); }}}

你可能感兴趣的:(android 流量统计)