21

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

本机操作系统的数据使用配置屏幕。

数据使用 OS 系统配置画面

我想要极限值和警告值。

我已经尝试过这个但不起作用,并且总是将 NULL 返回给两者:

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

// recommendedBytes and maximumBytes are NULL

TrafficStats类只是传输数据而不是限制。

4

2 回答 2

19

经过几天对这个问题的搜索和研究,我找不到答案。贝娄我会举起我所做的每一次尝试。

1.下载管理器

使用此类,您可以通过任何网络或设备状态开始下载,它将处理所有状态,例如网络丢失、设备重启等...

有两种方法叫做getMaxBytesOverMobileand getRecommendedMaxBytesOverMobile,它们是第一次解决这个问题的好方法。但是在代码测试和 下载管理器实施研究之后,我发现下载管理器无法获取这些值。

原因

这些方法Settings.Secure.getLong使用它们各自的标签 调用Settings.Secure.DOWNLOAD_MAX_BYTES_OVER_MOBILE, 然后调用内部类内部Settings.Secure.DOWNLOAD_RECOMMENDED_MAX_BYTES_OVER_MOBILE的惰性映射。StringNameValueCache

到目前为止还可以,但没有一个内部类或Settings实现它自己使用DOWNLOAD_MAX_BYTES_OVER_MOBILEDOWNLOAD_RECOMMENDED_MAX_BYTES_OVER_MOBILE内部。

我认为惰性映射是由第三个实体填充的,实际上发生了什么,所以我找到了 处理惰性映射新值的内部类。这 是由内部类调用的方法(调用Secure System NameValueTable SettingsputStringprotectedSettings.SecureSettings.System

所以我可以得出结论,如果操作系统实现不放置那些字符串值,我就无法得到它们。

2.交通统计

快速浏览一下官方参考资料,我会注意到它对我没有帮助,因为这个类只提供自上次设备启动以来传输的字节和包的数量。

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

3. NetworkPolicyManager 和 NetworkPolicy

正如@bina 在这里发布的那样,这两个类都是隐藏的,不能被普通应用程序使用,例如将在 Google Play 中发布的应用程序。

https://stackoverflow.com/a/24445424/575643

4.连接管理器

简而言之,你只能得到NetworkInfo那些没有提供太多关于用户偏好的信息(真的没有!)。只需提供有关网络的信息,例如移动网络提供商。

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

毕竟我认为现在没有办法获得这些信息。请如果您阅读它并在此处找到方法发布!

谢谢大家。

PS.:抱歉英文错误。

于 2014-07-02T15:27:27.923 回答
11

你想在这个例子中获得限制值(5GB)和警告值(2GB)吗?

如果是这样,你可以通过以下代码获取limitBytes和warningBytes,如果你可以使用android.permission.MANAGE_NETWORK_POLICY和android.permission.READ_PHONE_STATE。
但是, android.permission.MANAGE_NETWORK_POLICY protectionLevel 是签名。

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 类被隐藏)

于 2014-06-27T06:36:09.583 回答