Как получить данные 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;
Но я не мог придумать, как получить эти данные с определенной даты ИЛИ за месяц? Пожалуйста помоги. Любой указатель будет оценен. Благодарю.
2 ответа
Прежде всего, TrafficStats.getTotalRxPackets():
Возвращает количество пакетов, полученных с момента загрузки устройства.
То же самое с TrafficStats.getTotalTxPackets()
Этот класс не полезен для получения статистики за месяц.
Я бы посоветовал решение, работающее из API 23:
Этот класс имеет возможность получать статистику для каждого устройства или пакета. Особенно полезным для вас будет функция:
NetworkStatsManager.querySummaryForDevice ()
которые ожидают измерения времени начала в качестве третьего параметра и времени окончания в качестве четвертого параметра.
Пример проекта можно найти здесь. Он показывает, как получить доступ к NetworkStatsManager, запрашивая соответствующие разрешения во время выполнения.
Это решение только API 23+.
Если вы действительно хотите использовать TrafficStats, то создайте Сервис, который будет получать результат TrafficStats.getTotalRxPackets() каждый час, посчитайте разницу, сохраните ее в базе данных в другой строке в день.
Я согласен с Р. Загорским, но у меня другой подход.
Используйте TrafficStats, чтобы получить количество полученных / отправленных пакетов, вычесть из него последнюю сумму и затем сохранить ее с помощью SharedPreferences вместе с последней суммой. Теперь, чтобы обработать перезапуск устройства, всегда проверяйте, больше ли последний счет, чем текущая сумма. Если да, сбросьте последнюю сумму на 0. Кроме того, следите за началом месяца. Как только месяц закончится, не забудьте сбросить счетчик до 0!
Если вы хотите также отслеживать результаты предыдущего месяца, используйте Список. Когда месяц закончится, добавьте общую сумму в массив по индексу номера месяца. Кроме того, имейте в виду, что первый индекс равен 0, а не 1. Таким образом, вам придется сместить массив на 1 значение, чтобы иметь возможность напрямую использовать номер месяца для запроса вашего списка.
Это имеет преимущество перед идеей Р. Загорского (что также весьма неплохо), что его можно использовать с уровня API 8, так как это минимум для TrafficStats.
Надеюсь я помог:D