问题就像询问每个应用的数据使用情况。不是整个设备的使用。因此,对于每个 uid,我们需要相应的应用程序的数据使用情况。以下用于获取特定 uid 的数据使用情况。这也不适用于所有设备。我检查并后来了解到,即使在我们授予应用程序使用跟踪权限后,在某些设备中也无法使用此功能。这是系统级别的权限。
long dataUsageWithRespectToUid = getPackageRxBytesMobile(this)+ getPackageTxBytesMobile(this) + getPackageRxBytesWifi() +getPackageTxBytesWifi();
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();
}