Я могу перечислить приложения, которые успешно используют сеть, используя TrafficStats
для устройств ниже Android N и NetworkStatsManager
для Android N и выше, как показано ниже:
Код TrafficStats:
private void getTrafficInfosByTrafficStatsAPI(PackageManager pm) {
//List<TrafficInfo> trafficlnfos = new ArrayList<>();
TrafficStats.setThreadStatsTag(0);
List<PackageInfo> packinfos = pm.getInstalledPackages(PackageManager.GET_PERMISSIONS);
for (PackageInfo info : packinfos) {
String[] premissions = info.requestedPermissions;
if (premissions != null && premissions.length > 0) {
for (String premission : premissions) {
if ("android.permission.INTERNET".equals(premission)) {
int uid = info.applicationInfo.uid;
long totalRx = TrafficStats.getTotalRxBytes();
long totalTx = TrafficStats.getTotalTxBytes();
Log.d(TAG, info.packageName + " " + totalRx + " " + totalTx);
}
}
}
}
}
и ниже с использованием NetworkStatsManager:
private void getNetworkStatsBuckets(PackageManager pm) throws PackageManager.NameNotFoundException, RemoteException {
NetworkStatsManager networkStatsManager = (NetworkStatsManager) getSystemService(Context.NETWORK_STATS_SERVICE);
TelephonyManager manager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
String subscriberId = manager.getSubscriberId();
List<PackageInfo> packinfos = pm.getInstalledPackages(PackageManager.GET_PERMISSIONS);
for (PackageInfo pInfo : packinfos) {
String[] premissions = pInfo.requestedPermissions;
if (premissions != null && premissions.length > 0) {
for (String premission : premissions) {
if ("android.permission.INTERNET".equals(premission)) {
ApplicationInfo info = pm.getApplicationInfo(pInfo.packageName, 0);
int uid = info.uid;
NetworkStats networkStats = networkStatsManager.queryDetailsForUid(ConnectivityManager.TYPE_WIFI, subscriberId , 0, System.currentTimeMillis(), uid );
long rxBytes = 0 , txBytes = 0;
while (networkStats.hasNextBucket()){
NetworkStats.Bucket bucket = new NetworkStats.Bucket();
networkStats.getNextBucket(bucket);
rxBytes += bucket.getRxBytes();
txBytes += bucket.getTxBytes();
}
Log.d(TAG, pInfo.packageName + " " + rxBytes + " " + txBytes);
}
}
}
}
return;
}
Я вижу все пакеты в моем LogCat с их переданными и полученными байтами с двумя подходами.
Проблема, которую я хочуразрешить пользователю сбросить эти счетчики и начать мониторинг использования сети приложением, начиная с момента, когда он очистил счетчики.
Я знаю, что в API TrafficStats
доступны такие методы, как
clearThreadStatsTag()
-> Я использовал это, но счетчики не очищены. clearThreadStatsUid()
-> Это не может быть решено, и я не знаю, почему
Для NetworkStatsManager
API я не могу найти соответствующие методы.
Итак, у меня здесь два вопроса?
- Как правильно использовать два метода очистки в
TrafficStats
API? - И можно ли очиститьсчетчики использования сети приложений, использующих
NetworkStatsManager
?Если да, как я могу это сделать?
Любая помощь очень ценится.Заранее спасибо.