2016-10-14 16 views
5

我已经搜索了很多关于这个。部分地找到解决目的的相同的代码。正如API文档所述,一旦设备重新启动,它就会重置计数器。有时,即使没有重新启动,计数器也会重置。以下是密码如何获取1个月的GPRS移动数据使用情况?

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; 

但我想不出有什么办法让这些数据从特定的日期或一个月?请帮忙。任何指针将不胜感激。 谢谢。

+0

请指点一下吗? – Bharat

+0

你可能会在这里找到答案http://stackoverflow.com/a/7640565/6689101 – zombie

回答

4

首先,TrafficStats.getTotalRxPackets():因为设备引导接收的数据包

返回数。

同样是TrafficStats.getTotalTxPackets()

该类不是用于获取月的统计数据很有帮助。

我建议溶液从API 23工作:

NetworkStatsManager

这个类有可能获得每设备或每包的统计信息。特别是有助于您将功能:

NetworkStatsManager.querySummaryForDevice()

其期望的测量开始时间作为第三个参数和结束时间为第四参数中。

示例项目可以找到here。它显示了如何获得对NetworkStatsManager的访问权限,以请求适当的运行时权限。

该解决方案仅为API 23+。

如果你真的想使用TrafficStats然后创建一个服务,每小时得到TrafficStats.getTotalRxPackets()的结果,计算差异,并将其保存在数据库中,每天以不同的行数。

+0

你好Zag, 感谢您的信息。我的回答很有用,我正在努力实施。 – Bharat

+0

我面临1个问题,但无法解决它。错误:“java.lang.RuntimeException:java.lang.SecurityException:NetworkStats:用户10053或当前进程都没有android.permission.READ_NETWORK_USAGE_HISTORY”。我在API 23中实现了这个功能,它有一个运行时安全实现,我希望你明白我想说的是什么。我能够在Manifest中添加android.permission.READ_NETWORK_USAGE_HISTORY,但我无法在Java文件中添加相同的权限,因为它提供了编译错误。能否请你帮忙 ? – Bharat

+0

查看[示例项目](https://github.com/RobertZagorski/NetworkStats)。特别是在'AndroidManifest.xml'和'MainActivity'中,如何查询并使用它。 –

0

我同意R. Zagorski,但我有一个不同的方法。

使用TrafficStats可以获取收到/发送的数据包数量,从中减去最后一笔金额,然后使用SharedPreferences以及最后一笔金额进行保存。现在,要处理设备重启,请始终检查最后一次计数是否大于当前值。如果是,则将最后的金额重置为0.另外,记录月份开始的时间。本月结束后,不要忘记将计数重置为0!

如果您希望跟踪上个月的计数,请使用列表。月份结束后,将总金额添加到月份编号索引处的数组中。另外,请记住,第一个索引是0,而不是1.因此,您必须将数组偏移1个值才能够直接使用月份数来查询您的列表。

这比R. Zagorski的想法(这也是相当不错的)的优势在于,它可以从api级别8使用,因为这是TrafficStats的最小值。

希望我帮助过:D

相关问题