Расчет использования Youtube с помощью TrafficStats

Используя TrafficStats, я проверял использование данных приложения YouTube. На некоторых устройствах он работает нормально, но не на многих других устройствах. Я обнаружил, что с сайта разработчика эта статистика может быть доступна не на всех платформах. Если статистика не поддерживается этим устройством, будет возвращено UNSUPPORTED.

Итак, в этом случае, как я могу получить использование приложения устройства?

Я использовал TrafficStats.getUidRxBytes(packageInfo.uid) + TrafficStats.getUidTxBytes(packageInfo.uid);

это возвращает -1 каждый раз.


person rajeesh    schedule 21.12.2016    source источник


Ответы (1)


Мы можем использовать NetworkStats. https://developer.android.com/reference/android/app/usage/NetworkStats.html Пожалуйста, посмотрите пример репозитория, который я понял. https://github.com/RobertZagorski/NetworkStats Мы также можем увидеть аналогичный вопрос о переполнении стека. Получение истории использования мобильных данных с помощью NetworkStatsManager

Затем мне нужно было изменить эту логику для некоторых конкретных устройств. В этих устройствах обычный метод не будет возвращать правильные значения использования. Итак, я изменил как

/* получение информации об использовании YouTube как для мобильных устройств, так и для Wi-Fi. */

    public long getYoutubeTotalusage(Context context) {
            String subId = getSubscriberId(context, ConnectivityManager.TYPE_MOBILE);

//both mobile and wifi usage is calculating. For mobile usage we need subscriberid. For wifi we can give it as empty string value.
            return getYoutubeUsage(ConnectivityManager.TYPE_MOBILE, subId) + getYoutubeUsage(ConnectivityManager.TYPE_WIFI, "");
        }


private long getYoutubeUsage(int networkType, String subScriberId) {
        NetworkStats networkStatsByApp;
        long currentYoutubeUsage = 0L;
        try {
            networkStatsByApp = networkStatsManager.querySummary(networkType, subScriberId, 0, System.currentTimeMillis());
            do {
                NetworkStats.Bucket bucket = new NetworkStats.Bucket();
                networkStatsByApp.getNextBucket(bucket);
                if (bucket.getUid() == packageUid) {
                    //rajeesh : in some devices this is immediately looping twice and the second iteration is returning correct value. So result returning is moved to the end.
                    currentYoutubeUsage = (bucket.getRxBytes() + bucket.getTxBytes());
                }
            } while (networkStatsByApp.hasNextBucket());

        } catch (RemoteException e) {
            e.printStackTrace();
        }

        return currentYoutubeUsage;
    }


    private String getSubscriberId(Context context, int networkType) {
        if (ConnectivityManager.TYPE_MOBILE == networkType) {
            TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            return tm.getSubscriberId();
        }
        return "";
    }
person rajeesh    schedule 17.01.2017