文档章节

Android TrafficStats流量监控

IamOkay
 IamOkay
发布于 2014/11/14 11:24
字数 1115
阅读 2K
收藏 3

一、流量监控TrafficStats

对于Android流量统计来说在2.2版中新加入了TrafficStats类可以轻松获取,其实本身TrafficStats类也是读取Linux提供的文件对象系统类型的文本进行解析。android.net.TrafficStats类中,提供了多种静态方法,可以直接调用获取,返回类型均为 long型,如果返回等于-1代表 UNSUPPORTED 当前设备不支持统计。 

static long  getMobileRxBytes()  //获取通过Mobile连接收到的字节总数,不包含WiFi  
static long  getMobileRxPackets()  //获取Mobile连接收到的数据包总数  
static long  getMobileTxBytes()  //Mobile发送的总字节数  
static long  getMobileTxPackets()  //Mobile发送的总数据包数  
static long  getTotalRxBytes()  //获取总的接受字节数,包含Mobile和WiFi等  
static long  getTotalRxPackets()  //总的接受数据包数,包含Mobile和WiFi等  
static long  getTotalTxBytes()  //总的发送字节数,包含Mobile和WiFi等  
static long  getTotalTxPackets()  //发送的总数据包数,包含Mobile和WiFi等   
static long  getUidRxBytes(int uid)  //获取某个网络UID的接受字节数  
static long  getUidTxBytes(int uid) //获取某个网络UID的发送字节数   

总接受流量TrafficStats.getTotalRxBytes(), 
总发送流量TrafficStats.getTotalTxBytes()); 
不包含WIFI的手机GPRS接收量TrafficStats.getMobileRxBytes()); 
不包含Wifi的手机GPRS发送量TrafficStats.getMobileTxBytes()); 

某一个进程的总接收量TrafficStats.getUidRxBytes(Uid)); 
某一个进程的总发送量TrafficStats.getUidTxBytes(Uid)); 

这些都是从第一次启动程序到最后一次启动的统计量。并不是这篇文章里所说的“从本次开机到本次关机的统计量”! 

用法举例,注意这里得到的单位都是"KB" 

 

public long getTotalRxBytes(){  //获取总的接受字节数,包含Mobile和WiFi等  
        return TrafficStats.getTotalRxBytes()==TrafficStats.UNSUPPORTED?0:(TrafficStats.getTotalRxBytes()/1024);  
    }  
    public long getTotalTxBytes(){  //总的发送字节数,包含Mobile和WiFi等  
        return TrafficStats.getTotalTxBytes()==TrafficStats.UNSUPPORTED?0:(TrafficStats.getTotalTxBytes()/1024);  
    }  
    public long getMobileRxBytes(){  //获取通过Mobile连接收到的字节总数,不包含WiFi  
        return TrafficStats.getMobileRxBytes()==TrafficStats.UNSUPPORTED?0:(TrafficStats.getMobileRxBytes()/1024);  
    }  

 

二、TrafficStatsCompat

此方法是v4包中兼容TrafficStats的方法,基本用法和TrafficStats类似。再次不在赘述。

 

三、Android 6.0 NetworkStatsManager

在Android 6.0(API23)中新增加的类,提供网络使用历史统计信息,同时特别强调了可查询指定时间间隔内的统计信息。

查询指定网络类型在某时间间隔内的总的流量统计信息      

NetworkStats.BucketquerySummaryForDevice(intnetworkType,StringsubscriberId,longstartTime,longendTime)

查询某uid在指定网络类型和时间间隔内的流量统计信息

NetworkStatsqueryDetailsForUid(intnetworkType,StringsubscriberId,longstartTime,longendTime,intuid)

查询指定网络类型在某时间间隔内的详细的流量统计信息(包括每个uid)

NetworkStatsqueryDetails(intnetworkType,StringsubscriberId,longstartTime,longendTime)

        从上述函数和文档看,NetworkStatsManager类克服了TrafficStats的查询限制,而且统计信息也不再是设备重启以来的数据。

NetworkStatsManager的使用需要额外的权限,”android.permission.PACKAGE_USAGE_STATS”是系统权限,需要主动引导用户开启应用的“有权查看使用情况的应用”(使用记录访问权限)权限,后面会有代码示例。

 

AndroidManifest中添加权限声明

<user-permission android:name="android.permission.READ_PHONE_STATE"/>

<user-permission android:name="android.permission.PACKAGE_USAGE_STATS" />

<user-permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY" />

获取权限代码如下

private boolean hasPermissionToReadNetworkStats() {

  int permissionCheck = 
  ContextCompat.checkSelfPermission(this,Manifest.permission.READ_PHONE_STATE);

 if (permissionCheck != PackageManager.PERMISSION_GRANTED) {

      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_READ_PHONE_STATE);

} else {

 

}

   if(Build.VERSION.SDK_INT<23)

     return true;

 }

final AppOpsManager appOps=(AppOpsManager)getSystemService(Context.APP_OPS_SERVICE);

int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,android.os.Process.myUid(),getPackageName());

  if(mode==AppOpsManager.MODE_ALLOWED){

      return true;

 }

  requestReadNetworkStats();

  return false;

}

//如果未获得权限,主动去设置界面开启
private void  requestReadNetworkStats(){

Intentintent=newIntent(Settings.ACTION_USAGE_ACCESS_SETTINGS);

startActivity(intent);

}

 

查看设备和某应用的流量统计

(1)获取NetworkStatsManager示例对象

NetworkStatsManagernetworkStatsManager=(NetworkStatsManager)getSystemService(NETWORK_STATS_SERVICE);

(2)查询设备总的流量统计信息

NetworkStats.Bucketbucket=null;//获取到目前为止设备的Wi-Fi流量统计

bucket=networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_WIFI,"",0,System.currentTimeMillis());

Log.i("Info","Total: "+(bucket.getRxBytes()+bucket.getTxBytes()));

(3)查询某应用(uid)的数据流量统计信息


//获取subscriberId

TelephonyManager tm=TelephonyManager)getSystemService(TELEPHONY_SERVICE);
StringsubId=tm.getSubscriberId();

NetworkStatssummaryStats;

longsummaryRx=0;
longsummaryTx=0;
longsummaryRx =0;
longStartTx=0;

NetworkStats.BucketsummaryBucket=newNetworkStats.Bucket();

longsummaryTotal=0;

summaryStats=networkStatsManager.querySummary(ConnectivityManager.TYPE_MOBILE,subId,getTimesMonthmorning(),System.currentTimeMillis());

do{

              summaryStats.getNextBucket(summaryBucket);

              intsummaryUid=summaryBucket.getUid();

             if(uid==summaryUid){

                summaryRx+=summaryBucket.getRxBytes();
                Rx+=summaryRx;
                summaryTx+=summaryBucket.getTxBytes();

               Tx+=summaryTx;

              }        

}while(summaryStats.hasNextBucket());

四、补充知识

Jar包冲突的原因

  1. jar包重复依赖,使用了Build Path,必须移除才行

  2. jar包版本不同,比如v4,同一个项目中,必须使用同一版本的v4,v7等

LogCat

Dex Loader] Unable to execute dex: Multiple dex files define Landroid/annotation/SuppressLint;
CustomViewTest] Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Landroid/annotation/SuppressLint;

android.annotation.SuppressLint类被多次定义了,也就是说jar包内的某些类冲突了,删除冲突的jar包 annotation.jar即可

 

© 著作权归作者所有

IamOkay

IamOkay

粉丝 205
博文 490
码字总数 410453
作品 0
海淀
程序员
私信 提问
加载中

评论(0)

android应用流量统计小谈

最近有一个项目需要对android设备上安装的应用进行流量统计,并且分离出每个应用通过wifi和手机网络分别用了多少流量。花了一些时间查阅资料和代码编写,终于完成了一个DEMO版本,最后做了一...

TiHou
2013/11/26
8K
9
Android基础性能数据获取(api或/proc/读取)

主要资料参考 Android系统源码在线查看网址 Linux平台Cpu使用率的计算 腾讯开源移动端性能测试APP:GT 3.1 内存篇 内存:表示当前进程内存的使用情况,内存占用过高可能会引起内存抖动,或O...

某杰
2018/05/07
0
0
安卓App流量统计

android app流量统计.(http://my.oschina.net/chenbilly/blog/168613) 本文讲述了关于android流量的简介,如何使用TrafficStats获取流量,并设计一个完整的APP流量统计,最后深入了解如何通过其...

chenbilly
2013/10/14
3K
1
android流量统计

对于android 手机流量的统计,大家有什么好建议吗?对应系统类Trafficstats统计出来的数据是不准的。求分享实现的方案。。。。

SummaryCcc
2016/11/21
396
0
怎样去显示安卓的实时网速

我想问一下怎样在安卓上显示网速,而且一直留在状态栏那里!如何实现呢,大神们有具体的分析吗?我能想到用TrafficStats每个100毫秒去获取一次当前网络的中接受数据的总量,然后后一次的数据...

Seederland
2014/11/03
1.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

过拟合问题

本文作者:HelloDeveloper 很多人说,看了再多的文章,可是没有人手把手地教授,还是很难真正地入门AI。为了将AI知识体系以最简单的方式呈现给你,从这个星期开始,芯君邀请AI专业人士开设“...

百度开发者中心
2019/09/23
8
0
在Ruby on Rails中对nil v。空v。空白的简要解释 - A concise explanation of nil v. empty v. blank in Ruby on Rails

问题: I find myself repeatedly looking for a clear definition of the differences of nil? 我发现自己一再寻找nil?差异的明确定义nil? , blank? , blank? , and empty? , empty? in ......

javail
47分钟前
15
0
DevOps与NoOps现状分析

时下的IT趋势中,DevOps 正是一个热语。它起源于几年前SPA (单页面应用) 的前端应用.我认为常态的IT技术适应就是,在新技术爆发的那一时刻开始,立马就会被敏锐的人们所采用,然后被快速传播...

tidings_
50分钟前
17
0
OSChina 周六乱弹 —— 代码创造人工生命

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @小小编辑推荐:《inner universe》 - ORIGA 《inner universe》 - ORIGA 手机党少年们想听歌,请使劲儿戳(这里) 当机器人具有意识的时候,...

小小编辑
今天
20
1
怎么创建远程桌面连接

1、IIS7远程桌面 管理中文最新版是一款专业的远程桌面管理工具,更新了原09网络远程桌面管理,较之以前的版本,操作更加便捷,能够同时远程多台服务器,多台服务器间自由切换,完全无压力。I...

吹的心痒痒
今天
22
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部