Android - очистить использование сети с помощью API-интерфейсов TrafficStats и NetworkStatsManager - PullRequest
0 голосов
/ 20 июня 2019

Я могу перечислить приложения, которые успешно используют сеть, используя 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?Если да, как я могу это сделать?

Любая помощь очень ценится.Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...