2016-10-14 17 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

相關問題