您的位置:首页 > 其它

获取手机应用流量TrafficStats的使用

2014-07-17 11:42 211 查看

概述

安卓是基于Linux改编的,在2.2版本中加入了TrafficStats类,通过使用这个类可以轻松获取到手机从开机到使用本类时手机所使用的流量以及单应用的上下行流量。

在安卓2.2版本之前如果需要查询流量,需要利用Linux提供的方法来读取流浪存储的文件,这个文件在“/proc/uid_stat/UID/”文件夹下(UID是应用在手机内的唯一ID号),在这个文件夹下有两个文件,这两个文件记录了手机从开机到现在的上行流量和下行流量。

在安卓4.3版本中不知原因不支持TrafficStats利用UID获取流量的方法,但在4.4版本中又支持,所以在4.3版本中只能用读取文本的方式代替TrafficStats类进行解析。

无论是利用TrafficStats或是读取文件的方式进行查看单应用所用的流量,记录的这些数据都是从这次开机开始到查询时的流量,这些流量统计关机之后将被清除。

TrafficStats类中,提供了多种静态方法,可以直接调用获取,返回类型均为long型,如果返回等于-1代表 UNSUPPORTED ,表示当前设备不支持统计。

具体使用

使用TrafficStats获取

public PackagesInfo(Context context) {
// 通包管理器,检索所有的应用程序(甚至卸载的)与数据目录
this.context = context;
pm = context.getApplicationContext().getPackageManager();

appList = pm
.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES
| PackageManager.GET_PERMISSIONS);
// appList = pm.getInstalledPackages(PackageManager.GET_ACTIVITIES);
// appList = pm.getInstalledPackages(0);
}

/**
* 通过一个程序名返回该程序的一个Application对象。
*
* @param name  程序名
* @return ApplicationInfo
*/
public ApplicationInfo getInfo(String name) {
if (name == null) {
return null;
}
for (ApplicationInfo appinfo : appList) {
if (name.equals(appinfo.processName)) {

return appinfo;
}
}

return null;
}

/**
*
* @param name
*            单应用流量获取
*
* @return List<AppInfo>
*/
public List<AppInfo> getRunningProcess() {
ActivityManager am = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
// 获取正在运行的应用
List<RunningAppProcessInfo> run = am.getRunningAppProcesses();

List<AppInfo> list = new ArrayList<AppInfo>();
List<AppInfo> slist = new ArrayList<AppInfo>();

for (RunningAppProcessInfo ra : run) {
// 过滤掉没有联网的
int result = context.getPackageManager().checkPermission(
"android.permission.INTERNET", ra.processName);
if (result != PackageManager.PERMISSION_GRANTED) {
continue;
}
long appSent = TrafficStats.getUidTxBytes(ra.uid);
long appRev = TrafficStats.getUidRxBytes(ra.uid);
appSent = appSent/1024;
appRev = appRev/1024;
if (appSent < 0 || appRev < 0
|| (appSent == 0 && appRev == 0)) {
continue;
}
// 过滤掉无对应的程序
if (getInfo(ra.processName) != null) {
if ((getInfo(ra.processName).flags & ApplicationInfo.FLAG_SYSTEM) == 0<span style="font-family: Arial, Helvetica, sans-serif;">// 非系统应用</span>
&&
(getInfo(ra.processName).flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0) {
// 本来是系统应用但升级后成为安装应用的
AppInfo appInfo = new AppInfo();
appInfo.setApp_name(getInfo(ra.processName).loadLabel(pm)
.toString());
appInfo.setApp_package(ra.processName);

appInfo.setApp_sent(appSent);
appInfo.setApp_rev(appRev);

list.add(appInfo);

} else {// 系统应用
AppInfo appInfo = new AppInfo();
appInfo.setApp_name(getInfo(ra.processName).loadLabel(pm)
.toString());
appInfo.setApp_package(ra.processName);

appInfo.setApp_sent(appSent);
appInfo.setApp_rev(appRev);

slist.add(appInfo);

}
}

}
list.addAll(slist);
return list;

}


使用读取文件的方式获取

List<AppInfo> list = new ArrayList<AppInfo>();
File dir = new File("/proc/uid_stat/");
String[] children = dir.list();

if (children != null) {
for (int i = 0; i < children.length; i++) {
int uid = Integer.parseInt(children[i]);
AppInfo appInfo = new AppInfo();

String uidString = String.valueOf(uid);
File uidFileDir = new File("/proc/uid_stat/" + uidString);
File uidrec = new File(uidFileDir, "tcp_rcv");
File uidsent = new File(uidFileDir, "tcp_snd");
StringBuilder text = new StringBuilder();

try {
BufferedReader rec = new BufferedReader(new FileReader(
uidrec));
BufferedReader sent = new BufferedReader(new FileReader(
uidsent));

appInfo.setApp_rev((Integer.valueOf(rec.readLine()))/1024);
appInfo.setApp_sent((Integer.valueOf(sent.readLine()))/1024);
String packageName = pm.getNameForUid(uid);
appInfo.setApp_package(packageName);

String lableName;

lableName = pm.getApplicationLabel(
pm.getApplicationInfo(packageName,
PackageManager.GET_META_DATA)).toString();
appInfo.setApp_name(lableName);
// Log.i("PackageInfo",appInfo.toString() );
list.add(appInfo);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// handle this
e.printStackTrace();
}

}

}
return list;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: