我正在构建一个数据管理器应用程序,它需要通过移动和wifi接口报告每个应用程序的数据使用情况。
在尝试使用方法"NetworkStatsManager.querySummary"时,我只得到一些UID的使用情况报告,而不是全部。虽然API的方法文档中确实说明了
过滤结果以仅包括属于调用用户的uid
我不清楚哪些UID属于调用用户,哪些不属于。请帮助我了解差异,以及如何使用这个新的"NetworkStatsManager"类获得所有UID的数据使用报告。
可以获取设备的摘要。只需使用另一种方法:android.app.usage.NetworkStatsManager#querySummaryForDevice
。以下是示例用法:
WiFi:
NetworkStats.Bucket bucket;
try {
bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_WIFI,
"",
0,
System.currentTimeMillis());
} catch (RemoteException e) {
return -1;
}
移动:
public long getAllTxBytesMobile(Context context) {
NetworkStats.Bucket bucket;
try {
bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE,
getSubscriberId(context, ConnectivityManager.TYPE_MOBILE),
0,
System.currentTimeMillis());
} catch (RemoteException e) {
return -1;
}
return bucket.getTxBytes();
}
private String getSubscriberId(Context context, int networkType) {
if (ConnectivityManager.TYPE_MOBILE == networkType) {
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
return tm.getSubscriberId();
}
return "";
}
要获取Rx或Tx字节,只需调用:
bucket.getRxBytes();
bucket.getTxBytes();
制作了一个示例Github repo来演示其用法。
问题就像询问每个应用程序的数据使用情况。不是整个设备的使用情况。因此,对于每个uid,我们需要相应的应用程序的数据使用情况。以下内容用于获取特定uid的数据用法。这也不适用于所有设备。我检查了一下,后来了解到,在某些设备中,即使在我们授予应用程序使用跟踪权限后,这也不可用。不过,这是系统级权限。
long dataUsageWithRelianceToUid=getPackageRxBytesMobile(this)+getPackageTxBytesMobile(this)+getPackageRx BytesWifi()+getPackage TxBytesWiFi();
public long getPackageRxBytesMobile(Context context) {
NetworkStats networkStats = null;
try {
networkStats = networkStatsManager.queryDetailsForUid(
ConnectivityManager.TYPE_MOBILE,
getSubscriberId(context, ConnectivityManager.TYPE_MOBILE),
0,
System.currentTimeMillis(),
packageUid);
} catch (RemoteException e) {
return -1;
}
NetworkStats.Bucket bucket = new NetworkStats.Bucket();
networkStats.getNextBucket(bucket);
networkStats.getNextBucket(bucket);
return bucket.getRxBytes();
}
public long getPackageTxBytesMobile(Context context) {
NetworkStats networkStats = null;
try {
networkStats = networkStatsManager.queryDetailsForUid(
ConnectivityManager.TYPE_MOBILE,
getSubscriberId(context, ConnectivityManager.TYPE_MOBILE),
0,
System.currentTimeMillis(),
packageUid);
} catch (RemoteException e) {
return -1;
}
NetworkStats.Bucket bucket = new NetworkStats.Bucket();
networkStats.getNextBucket(bucket);
return bucket.getTxBytes();
}
public long getPackageRxBytesWifi() {
NetworkStats networkStats = null;
try {
networkStats = networkStatsManager.queryDetailsForUid(
ConnectivityManager.TYPE_WIFI,
"",
0,
System.currentTimeMillis(),
packageUid);
} catch (RemoteException e) {
return -1;
}
NetworkStats.Bucket bucket = new NetworkStats.Bucket();
networkStats.getNextBucket(bucket);
return bucket.getRxBytes();
}
public long getPackageTxBytesWifi() {
NetworkStats networkStats = null;
try {
networkStats = networkStatsManager.queryDetailsForUid(
ConnectivityManager.TYPE_WIFI,
"",
0,
System.currentTimeMillis(),
packageUid);
} catch (RemoteException e) {
return -1;
}
NetworkStats.Bucket bucket = new NetworkStats.Bucket();
networkStats.getNextBucket(bucket);
return bucket.getTxBytes();
}