Расчет использования Youtube с использованием TrafficStats
Используя TrafficStats, я проверял использование данных приложения YouTube. На некоторых устройствах он работает нормально, но не на многих других устройствах. Я обнаружил, что с сайта разработчика, эта статистика может быть доступна не на всех платформах. Если статистика не поддерживается этим устройством, UNSUPPORTED будет возвращено.
Так в таком случае, как я могу получить использование приложения устройства?
Я использовал TrafficStats.getUidRxBytes(packageInfo.uid) + TrafficStats.getUidTxBytes(packageInfo.uid);
это возвращает -1 каждый раз.
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 "";
}