如何以编程方式获取用户在 Android OS 配置上设置的数据使用限制?
Posted
技术标签:
【中文标题】如何以编程方式获取用户在 Android OS 配置上设置的数据使用限制?【英文标题】:How to get programmatically the data usage limit set by user on Android OS configuration? 【发布时间】:2014-08-13 11:58:09 【问题描述】:用户可以在数据使用屏幕上定义移动数据使用的限制和/或警告限制。那么如何通过代码获取这些信息呢?
本机操作系统的数据使用配置屏幕。
我想要极限值和警告值。
我已经尝试过了,但没有成功,并且总是返回 NULL 给两者:
final Long recommendedBytes = DownloadManager.getRecommendedMaxBytesOverMobile( this.context );
final Long maximumBytes = DownloadManager.getMaxBytesOverMobile( this.context );
// recommendedBytes and maximumBytes are NULL
而TrafficStats 类只是传输了一个数据而不是限制。
【问题讨论】:
您是否设置了INTERNET
权限?
@Manu 是的,还有更多...我尝试了所有这些:INTERNET、ACCESS_NETWORK_STATE、ACCESS_FINE_LOCATION、ACCESS_COARSE_LOCATION、CHANGE_WIFI_STATE、ACCESS_WIFI_STATE、READ_SYNC_SETTINGS。有些没有意义,但我尝试了所有我想的。
@xpto 你有什么解决方法吗?我也面临同样的问题,但对我来说 NetworkPolicyManager 被隐藏是一个问题,我找不到任何公共 API。
【参考方案1】:
你想在这个例子中获取限制值(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 类被隐藏)
【讨论】:
谢谢@bina,我也试过这个,但我需要这个值来用于一般应用程序,而不是特别种类。通过反射,我可以轻松调用 NetworkPolicyManager,但我需要设置您注意到的权限,所以它又成了一个问题。 NetworkPolicyManager 是一个隐藏类真是太痛苦了:( 此代码现已在 android 11 中弃用,因为它是非 Sdk API,Android 将其标记为隐藏 api【参考方案2】:经过几天对这个问题的搜索和研究,我找不到答案。我会放弃我所做的每一次尝试。
1. Download Manager
通过本课程,您可以通过任何网络或设备开始下载 state 它将处理所有状态,例如网络丢失,设备重启, 等等……
有两种方法称为
getMaxBytesOverMobile
和getRecommendedMaxBytesOverMobile
,他们是个不错的候选人 第一时间解决这个问题。但是经过代码测试和 Download Manager implementantion 研究我发现有 无法通过 DownloadManager 获取这些值。原因
这些方法调用
Settings.Secure.getLong
各自的标签Settings.Secure.DOWNLOAD_MAX_BYTES_OVER_MOBILE
和Settings.Secure.DOWNLOAD_RECOMMENDED_MAX_BYTES_OVER_MOBILE
在 转牌调用了一个懒惰的String
map 里面的 内部类名为NameValueCache
。到目前为止还可以,但没有内部类或
Settings
实现它 自用DOWNLOAD_MAX_BYTES_OVER_MOBILE
或DOWNLOAD_RECOMMENDED_MAX_BYTES_OVER_MOBILE
里面。我认为惰性映射是由第三个实体填充的,什么 确实发生了,所以我找到了
NameValueTable
Settings
处理惰性映射的新值的内部类。这putString
是由Settings.Secure
调用的protected
方法 和Settings.System
内部类(调用Secure 和 System)。所以我可以得出结论,如果操作系统实现不放置这些字符串值,我将无法获取它们。
2。 TrafficStats
快速浏览一下官方参考资料,我会注意到它会 对我没有帮助,因为这个类只提供字节数和 自上次设备启动后传输的包。
http://developer.android.com/reference/android/net/TrafficStats.html
3。 NetworkPolicyManager and NetworkPolicy
正如@bina 发布的here 一样,这两个类都是隐藏的,不能 由普通应用程序使用,例如将在 Google Play 上发布。
https://***.com/a/24445424/575643
4. ConnectivityManager
简而言之,你可以得到不提供的
NetworkInfo
很多关于用户偏好的信息(真的没有!)。只需提供 有关网络的信息,例如移动网络提供商。http://developer.android.com/reference/android/net/ConnectivityManager.html
毕竟我认为现在没有办法获得这些信息。如果您阅读了它并在此处找到了方法,请发帖!
谢谢大家。
PS.: 抱歉英文错误。
【讨论】:
以上是关于如何以编程方式获取用户在 Android OS 配置上设置的数据使用限制?的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式获取 Android 手机型号,如何在 android 中以编程方式获取设备名称和型号?
如何以编程方式获取 Firebase 中的注册用户列表 [重复]