获取手机应用流量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; }
相关文章推荐
- 91获取手机应用使用的流量的原理
- Android 获取手机整体流量使用情况以及某个应用的流量的统计
- 使用python编写脚本获取手机当前应用apk的信息
- 使用QQ第三方登录时,手机应用和网站应用对同一个QQ号,获取到的openid不一样
- android获取手机流量使用情况
- 使用QQ第三方登录时,手机应用和网站应用对同一个QQ号,获取到的openid不一样
- android获取手机流量使用情况
- 使用python编写脚本获取手机当前应用apk的信息
- Android 下获取所有应用的流量使用量
- 使用python编写脚本获取手机当前应用的信息
- android TrafficStates 获取手机流量使用情况
- Cordova - 使用Cordova开发iOS应用实战5(获取手机里照片,并编辑)
- 在vb中使用Iphlpapi.dll获取网络信息 第四章 第三节 实例一:网络数据流量图
- 获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用...
- 【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等) 收藏
- 解决win7使用connectify发射wifi手机显示一直显示获取ip地址等问题
- 使用WebClient HttpWebRequest 的高级应用,获取带验证的session下载权限
- 使用HTML 开发手机应用的几个成熟的framework - PhoneGap, jQuery, ExtJS Touch
- 使用私有API获取IMEI 手机发短信
- 智能手机用户购物辅助类应用使用习惯