对于 Android 中 TrafficStats 的以下两种方法存在疑惑: getUidTxBytes(int uid) 与 getUidRxBytes(int uid), 这两个方法返回该 UID 通过网络传输和接收的字节数。但是它的时间单位是什么?是每秒钟吗? 如果我想计算每个应用程序每天传输和接收的数据量,我该怎么办?我考虑了一种方法,将数据存储在 SQL 中并不断向表中添加数据。这样做合适吗?
对于 Android 中 TrafficStats 的以下两种方法存在疑惑: getUidTxBytes(int uid) 与 getUidRxBytes(int uid), 这两个方法返回该 UID 通过网络传输和接收的字节数。但是它的时间单位是什么?是每秒钟吗? 如果我想计算每个应用程序每天传输和接收的数据量,我该怎么办?我考虑了一种方法,将数据存储在 SQL 中并不断向表中添加数据。这样做合适吗?
还有一件事:据我所知,这些计数器仅计算TCP/IP。不包括UDP。因此,如果您需要非常精确的计算,并且所涉及的应用程序使用UDP/IP或除TCP之外的任何其他协议,则这些计数器将是错误的。
有关此功能如何工作的见解,请查看免费提供的Android源代码。有关文件是./frameworks/base/core/jni/android_net_TrafficStats.cpp
此函数从/proc/uid_stat/[uid]/tcp_snd
获取数据。如果您需要更多信息,请深入了解Linux内核...
在这里,我获取那些具有互联网权限的应用程序,您可以更改权限名称并根据需要获取应用程序。
ArrayList<AppObject> listApps;
public void getAllAppList() {
listApps = new ArrayList<AppObject>();
PackageManager p = getPackageManager();
List<ApplicationInfo> packages = p.getInstalledApplications(PackageManager.GET_META_DATA);
for (ApplicationInfo applicationInfo : packages) {
try {
PackageInfo packageInfo = p.getPackageInfo(applicationInfo.packageName, PackageManager.GET_PERMISSIONS);
String[] permissions = packageInfo.requestedPermissions;
for (String permissionName : permissions) {
if (permissionName.equals("android.permission.INTERNET")) {
ApplicationInfo appInfo = packageInfo.applicationInfo;
AppObject appObject = new AppObject();
appObject.appDrawable = getPackageManager().getApplicationIcon(appInfo);
appObject.appName = (String) getPackageManager().getApplicationLabel(appInfo);
appObject.dataUsage = getDataUsage(appInfo);
listApps.add(appObject);
}
}
} catch (NullPointerException e) {
e.printStackTrace();
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
Debug.e("APP_SIZE", ":" + listApps.size());
appsAdapter.addAll(listApps);
}
public String getDataUsage(ApplicationInfo appInfo) {
int uid = appInfo.uid;
double received = (double) TrafficStats.getUidRxBytes(uid) / (1024 * 1024);
double sent = (double) TrafficStats.getUidTxBytes(uid) / (1024 * 1024);
double total = received + sent;
return String.format("%.2f", total) + " MB";
}
getUidRxBytes() 和 getUidTxBytes() 分别用于接收和发送字节。如果要监视每个应用程序的数据,只需查找每个进程的 UID 并查找与每个进程对应的数据,这将是每个应用程序的数据,然后你可以使用此代码进行计算。
TextView totData = (TextView)findViewById(R.id.totData);
TextView wifiTot = (TextView)findViewById(R.id.wifitotData);
TextView wifiTX = (TextView)findViewById(R.id.wifiUpData);
TextView wifiRX = (TextView)findViewById(R.id.wifiDownData);
TextView mobileTot = (TextView)findViewById(R.id.mobtotData);
TextView mobTX = (TextView)findViewById(R.id.mobUpData);
TextView mobRX = (TextView)findViewById(R.id.mobDownData);
/*
* Converting bytes to MB
*/
long rxBytes = TrafficStats.getTotalRxBytes()/1048576;
long txBytes = TrafficStats.getTotalTxBytes()/1048576;
long mobUpload = TrafficStats.getMobileTxBytes()/1048576;
long mobDown = TrafficStats.getMobileRxBytes()/1048576;
long wifiUpload = txBytes-(mobUpload);
long wifiDown = rxBytes-(mobDown);
wifiRX.setText(Long.toString(wifiDown));
wifiTX.setText(Long.toString(wifiUpload));
long wifitot = wifiUpload+wifiDown;
wifiTot.setText(Long.toString(wifitot));
mobTX.setText(Long.toString(mobUpload));
mobRX.setText(Long.toString(mobDown));
long mobTot = mobUpload+mobDown;
mobileTot.setText(Long.toString(mobTot));
totData.setText(Long.toString(wifitot+mobTot));