Как получить использование данных GPRS Mobile на 1 месяц?

Я много искал об этом. Везде находил один и тот же код, который частично решает задачу. Как говорится в документации API, он сбрасывает счетчик после перезагрузки устройства. Иногда счетчик просто сбрасывается даже без перезагрузки. Ниже приведен код

float totalRxBytes = (float)TrafficStats.getTotalRxBytes()/(float)1048576;  // Received
float totalTxBytes = (float)TrafficStats.getTotalTxBytes()/(float)1048576;  // Sent
float mobRxBytes = (float)TrafficStats.getMobileRxBytes()/(float)1048576;
float mobTxBytes = (float)TrafficStats.getMobileTxBytes()/(float)1048576;
float wifiRxBytes = totalRxBytes - mobRxBytes;
float wifiTxBytes = totalTxBytes - mobTxBytes;  

Но я не мог понять, как получить эти данные с определенной даты ИЛИ за месяц? Пожалуйста помоги. Любой указатель будет оценен. Спасибо.


person Bharat    schedule 14.10.2016    source источник
comment
какие-нибудь указатели, пожалуйста?   -  person Bharat    schedule 14.10.2016
comment
вы можете найти ответ здесь stackoverflow.com/a/7640565/6689101   -  person zombie    schedule 17.10.2016


Ответы (2)


Прежде всего, TrafficStats.getTotalRxPackets():

Возвращает количество пакетов, полученных с момента загрузки устройства.

То же самое с TrafficStats.getTotalTxPackets().

Этот класс бесполезен для получения месячной статистики.

Я бы посоветовал решение, работающее с API 23:

NetworkStatsManager

Этот класс имеет возможность получать статистику по устройствам или по пакетам. Особенно полезной для вас будет функция:

NetworkStatsManager.querySummaryForDevice()

которые ожидают измерения времени начала в качестве третьего параметра и времени окончания в качестве четвертого параметра.

Пример проекта можно найти здесь. В нем показано, как получить доступ к NetworkStatsManager с запросом соответствующих разрешений во время выполнения. .

Это решение только API 23+.

Если вы действительно хотите использовать TrafficStats, создайте службу, которая будет получать результат TrafficStats.getTotalRxPackets() каждый час, количество разницу, сохраняйте ее в базе данных в разных строках в день.

person R. Zagórski    schedule 18.10.2016
comment
Привет Заг, Спасибо за информацию. Я отвечаю полезно, и я пытаюсь реализовать то же самое. - person Bharat; 14.11.2016
comment
Я столкнулся с 1 проблемой и еще не смог ее решить. ОШИБКА: java.lang.RuntimeException: java.lang.SecurityException: NetworkStats: ни пользователь 10053, ни текущий процесс не имеют android.permission.READ_NETWORK_USAGE_HISTORY. Я реализую это в API 23, который имеет реализацию безопасности во время выполнения для разрешения, я надеюсь, вы понимаете, что я пытаюсь сказать. Мне удалось добавить android.permission.READ_NETWORK_USAGE_HISTORY в манифест, но я не могу добавить такое же разрешение в файл Java, потому что это дает ошибку компиляции. Не могли бы вы помочь? - person Bharat; 14.11.2016
comment
Посмотрите пример проекта. Особенно в AndroidManifest.xml и в MainActivity о том, как попросить об этом и использовать. - person R. Zagórski; 14.11.2016

Я согласен с Р. Загорским, но имею в виду другой подход.

Используйте TrafficStats, чтобы получить количество полученных/отправленных пакетов, вычтите последнюю сумму из него, а затем сохраните его с помощью SharedPreferences вместе с последней суммой. Теперь, чтобы справиться с перезагрузкой устройства, всегда проверяйте, превышает ли последний счетчик текущую сумму. Если да, сбросьте последнюю сумму до 0. Также следите за тем, когда начался месяц. Как только месяц закончится, не забудьте сбросить счетчики на 0!

Если вы хотите также отслеживать подсчеты за предыдущий месяц, используйте список. Когда месяц закончится, добавьте общую сумму в массив по индексу номера месяца. Кроме того, имейте в виду, что первый индекс равен 0, а не 1. Таким образом, вам придется сместить массив на 1 значение, чтобы иметь возможность напрямую использовать номер месяца для запроса вашего списка.

Это имеет преимущество перед идеей Р. Загорски (которая тоже неплохая) в том, что ее можно использовать с уровня API 8, так как это минимум для TrafficStats.

Надеюсь, я помог :D

person Rippr    schedule 23.10.2016