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

本文深入探讨了安卓系统中流量统计的方法,包括如何使用TrafficStats类高效获取单应用流量以及通过文件读取方式替代的技术。重点介绍了在不同安卓版本中的流量统计差异及实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述       

        安卓是基于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;
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值