如何在Android操作系统配置中以编程方式获取用户设置的数据使用限制?

21

用户可以在数据使用界面定义移动数据使用的限制和/或警告限制。那么,我如何通过代码获取这些信息?

原生操作系统的数据使用配置屏幕。

Data usage OS system configuration screen

我想要获取限制值和警告值。

我已经尝试过以下代码,但并未起作用,并且始终将两者都返回为NULL:

final Long recommendedBytes = DownloadManager.getRecommendedMaxBytesOverMobile( this.context );
final Long maximumBytes = DownloadManager.getMaxBytesOverMobile( this.context );

// recommendedBytes and maximumBytes are NULL

TrafficStats 类仅具有传输的数据而没有限制。


你设置了 INTERNET 权限吗? - Manuel Allenspach
@Manu 是的,还有更多...我尝试了所有这些:INTERNET、ACCESS_NETWORK_STATE、ACCESS_FINE_LOCATION、ACCESS_COARSE_LOCATION、CHANGE_WIFI_STATE、ACCESS_WIFI_STATE、READ_SYNC_SETTINGS。有些没有意义,但我尝试了我想到的所有。 - Idemax
@xpto你有找到绕过的解决方案吗?我也遇到了同样的问题,但对我来说NetworkPolicyManager被隐藏是个问题,我找不到任何公共API。 - Bajrang Hudda
2个回答

19
在搜索和研究了几天之后,我没有找到这个问题的答案。下面我将列出我所做的每一次尝试。
1. 下载管理器 使用这个类,您可以在任何网络或设备状态下开始下载,并且它将处理所有状态,例如网络丢失、设备重启等等...
有两种方法被称为getMaxBytesOverMobilegetRecommendedMaxBytesOverMobile,它们是解决此问题的一个不错的候选方案。但是,在代码测试和Download Manager implementantion研究之后,我发现没有办法通过DownloadManager获取这些值。
原因
这些方法调用Settings.Secure.getLong与它们各自的标签Settings.Secure.DOWNLOAD_MAX_BYTES_OVER_MOBILESettings.Secure.DOWNLOAD_RECOMMENDED_MAX_BYTES_OVER_MOBILE一起,在内部类NameValueCache中调用一个惰性String映射。
到目前为止都还好,但是内部类或者Settings实现本身都没有使用DOWNLOAD_MAX_BYTES_OVER_MOBILEDOWNLOAD_RECOMMENDED_MAX_BYTES_OVER_MOBILE
我认为懒惰的映射由第三个实体填充,实际上就是这样,所以我找到了NameValueTable Settings内部类,该类处理懒惰映射的新值。putString是由Settings.SecureSettings.System内部类(SecureSystem的调用)调用的受保护方法。
所以我可以得出结论,如果操作系统实现不放置这些字符串值,我就无法获取它们。

2. TrafficStats

快速查看官方参考资料,我发现这个类不会对我有所帮助,因为该类仅提供了自上次设备启动以来传输的字节数和数据包数。

http://developer.android.com/reference/android/net/TrafficStats.html

3. NetworkPolicyManager 和 NetworkPolicy

正如@bina在here中所述,这两个类都是隐藏的,普通应用程序无法使用,例如将在Google Play上发布的应用程序。

https://dev59.com/nWAf5IYBdhLWcg3wskeQ#24445424

4. ConnectivityManager

简而言之,你只能获取到NetworkInfo,它并不提供关于用户偏好的信息(实际上没有!),只提供网络和移动网络供应商等信息。

http://developer.android.com/reference/android/net/ConnectivityManager.html

总之,我认为目前没有办法获取这些信息。如果您读到此并找到了方法,请在此发帖!

谢谢大家。

PS:抱歉我的英语错误。


11

您想在此示例中获取限制值(5GB)和警告值(2GB)吗?

如果是这样,您可以使用以下代码获取limitBytes和warningBytes,前提是您可以使用android.permission.MANAGE_NETWORK_POLICY和android.permission.READ_PHONE_STATE权限。
但是,android.permission.MANAGE_NETWORK_POLICY的保护级别为签名。

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和NetworkPolicy类已隐藏)


谢谢@bina,我也尝试过这个方法,但我需要将这个值应用到一般的应用程序中,而不是特定的应用程序。通过反射,我可以轻松地调用NetworkPolicyManager,但我需要设置你提到的权限,所以又变成了一个问题。 - Idemax
NetworkPolicyManager 是一个隐藏类,这太痛苦了 :( - Abc.Xyz
此代码已在Android 11中被弃用,因为它是一个非SDK API,并且Android将其标记为隐藏API。 - Bajrang Hudda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接