How to get programmatically the data usage limit set by user on Android OS configuration?
After days searching and research about this problem I couldn't find a answer for that. Bellow I will lift every attempt that I did.
1. Download Manager
With this class you can start download over any network or device state and it will handle all states e.g. network loss, device reboot, etc...
There are two methods called
getMaxBytesOverMobile
andgetRecommendedMaxBytesOverMobile
, they was a pretty candidate to solve this problem at first time. But after code tests and Download Manager implementantion research I'd found that there is no way to get thoose values by DownloadManager.Reason
Thoose methods call
Settings.Secure.getLong
with they respective labelsSettings.Secure.DOWNLOAD_MAX_BYTES_OVER_MOBILE
andSettings.Secure.DOWNLOAD_RECOMMENDED_MAX_BYTES_OVER_MOBILE
in the turn makes a call to a lazyString
map inside inside a inner class calledNameValueCache
.Ok so far but none of inner classes or
Settings
implementation it self useDOWNLOAD_MAX_BYTES_OVER_MOBILE
orDOWNLOAD_RECOMMENDED_MAX_BYTES_OVER_MOBILE
inside.I considered the lazy map was populate by a third entity, what actually happens, so I found the
NameValueTable
Settings
inner class that handle the new values to lazy map. TheputString
is aprotected
method call bySettings.Secure
andSettings.System
inner classes (calls of Secure and System).So I could conclude that if the OS implementantion do not put thoose String values I can't get them.
2. TrafficStats
Just a quick look on official reference I could notice that it will not help me because this class just provide the amount of bytes and packages that was trafficked since last device boot.
http://developer.android.com/reference/android/net/TrafficStats.html
3. NetworkPolicyManager and NetworkPolicy
As @bina posted here the both classes are hidden and could not be use by normal apps e.g. that will be published in Google Play.
https://stackoverflow.com/a/24445424/575643
4. ConnectivityManager
In short, you just can get the
NetworkInfo
that not provide much information about user preferences (really none!). Just provide informations about network and e.g. mobile network provider.http://developer.android.com/reference/android/net/ConnectivityManager.html
After all I assume that no way to get this information nowadays. Please if you read it and found a way post here!
Thanks for all.
PS.: Sorry by english mistakes.
Do you want to get limit value(5GB) and warnning value(2GB) in this example?
If so, you can get limitBytes and warningBytes by the following code, if you can use android.permission.MANAGE_NETWORK_POLICY and android.permission.READ_PHONE_STATE.
However, android.permission.MANAGE_NETWORK_POLICY protectionLevel is signature.
NetworkPolicyManager manager = (NetworkPolicyManager) getSystemService("netpolicy");
NetworkPolicy[] networkPolicies = manager.getNetworkPolicies();
Log.d("NetworkPolicy", "limitBytes is " + networkPolicies[0].limitBytes);
Log.d("NetworkPolicy", "warningBytes is " + networkPolicies[0].warningBytes);
(NetworkPolicyManager and NetworkPolicy classes are hidden)