您的位置:首页 > 移动开发 > Android开发

android 流量统计

2016-04-18 17:34 531 查看
说明:这里流量统计用到的方法只支持在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(); }}}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息