Как программно использовать лимит использования данных, установленный пользователем в конфигурации ОС Android?

Пользователь может определить на экране использования данных ограничение и/или предел предупреждения для использования мобильных данных. Итак, как я могу получить эту информацию по коду?

Экран конфигурации использования данных для собственной ОС.

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 класс просто передает данные не пределы.

Ответы

Ответ 1

После поиска дней и исследования этой проблемы я не мог найти ответа на это. Пыль я подниму все попытки, которые я сделал.

1. Менеджер загрузки

С помощью этого класса вы можете начать загрузку через любую сеть или устройство и он будет обрабатывать все состояния, например. потеря сети, перезагрузка устройства, и т.д...

Существует два метода: getMaxBytesOverMobile и getRecommendedMaxBytesOverMobile, они были довольно успешным кандидатом для решения этой проблемы в первый раз. Но после тестов кода и Внедрение диспетчера загрузок, я обнаружил, что есть нет способа получить значения Thoose с помощью DownloadManager.

Причина

Способы Thoose вызывают Settings.Secure.getLong с ними соответствующие ярлыки Settings.Secure.DOWNLOAD_MAX_BYTES_OVER_MOBILE и Settings.Secure.DOWNLOAD_RECOMMENDED_MAX_BYTES_OVER_MOBILE в поворот обращается к ленивому String карте внутри внутри внутренний класс называется NameValueCache.

Хорошо до сих пор, но ни один из внутренних классов или Settings не реализовал его самостоятельно использовать DOWNLOAD_MAX_BYTES_OVER_MOBILE или DOWNLOAD_RECOMMENDED_MAX_BYTES_OVER_MOBILE внутри.

Я считал, что ленивая карта была заполнена третьим лицом, что на самом деле это происходит, поэтому я нашел NameValueTable Settingsвнутренний класс, который обрабатывает новые значения для ленивой карты. putString является вызовом метода protected Settings.Secureи Settings.System внутренние классы (вызовы Secure и Система).

Итак, я могу заключить, что если реализация ОС не ставит значения Stoose String, я не могу их получить.

2. TrafficStats

Просто взглянув на официальную ссылку, я заметил, что это будет не помогите мне, потому что этот класс просто предоставляет количество байтов и пакетов, которые были загружены с момента последней загрузки устройства.

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

3. NetworkPolicyManager и NetworkPolicy

Поскольку @bina отправлено здесь, оба класса скрыты и не могут использовать обычными приложениями, например. которые будут опубликованы в Google Play.

fooobar.com/questions/331542/...

4. ConnectivityManager

Короче говоря, вы просто можете получить NetworkInfo, которые не обеспечивают много информации о предпочтениях пользователя (на самом деле нет!). Просто обеспечьте информацию о сети и, например, поставщик мобильной сети.

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

В конце концов, я предполагаю, что сейчас нет возможности получить эту информацию. Пожалуйста, если вы прочтете его и найдете здесь свой путь!

Спасибо всем.

PS: Извините за ошибки на английском языке.

Ответ 2

Вы хотите получить предельное значение (5 ГБ) и значение предупреждения (2 ГБ) в этом примере?

Если это так, вы можете получить 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 - скрытый класс)