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

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

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

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

Я хочу предельное значение и значение предупреждения.

Я уже пробовал это, но не работал и всегда возвращал NULL обоим:

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

// recommendedBytes and maximumBytes are NULL

И класс TrafficStats просто передает данные, а не ограничения.


comment
Вы установили разрешения INTERNET?   -  person Manuel Allenspach    schedule 25.06.2014
comment
@Manu Да и многое другое ... Я пробовал со всем этим: INTERNET, ACCESS_NETWORK_STATE, ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION, CHANGE_WIFI_STATE, ACCESS_WIFI_STATE, READ_SYNC_SETTINGS. Некоторые не имеют смысла, но я пробовал все, что думал.   -  person xpto    schedule 25.06.2014
comment
@xpto вы нашли какое-нибудь обходное решение? Я также сталкиваюсь с той же проблемой, но для меня NetworkPolicyManager скрыт, это проблема, и я не могу найти какой-либо общедоступный API для этого.   -  person Bajrang Hudda    schedule 21.04.2021


Ответы (2)


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

<сильный>1. Диспетчер загрузки

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

Существует два метода: getMaxBytesOverMobile и getRecommendedMaxBytesOverMobile, они был симпатичным кандидатом для решения этой проблемы в первый раз. Но после тестов кода и Реализация диспетчера загрузки Я обнаружил, что нет никакого способа получить эти значения с помощью 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 — это protected вызов метода Settings.Secure и Settings.System inner классы (вызовы Безопасный и Система).

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

<сильный>2. Статистика трафика

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

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

<сильный>3. NetworkPolicyManager и NetworkPolicy

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

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

<сильный>4. ConnectivityManager

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

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

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

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

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

person xpto    schedule 02.07.2014

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

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

person bina    schedule 27.06.2014
comment
Спасибо @bina, я тоже пробовал это, но мне нужно это значение для обычных приложений, а не для конкретных видов. С отражением я могу легко вызвать NetworkPolicyManager, но мне нужно настроить разрешение, которое вы заметили, поэтому это снова стало проблемой. - person xpto; 27.06.2014
comment
Очень больно, что NetworkPolicyManager — это скрытый класс :( - person Vadiraj Purohit; 04.11.2019
comment
Этот код теперь устарел в Android 11, так как это не-Sdk API, и Android пометил его как скрытый API. - person Bajrang Hudda; 20.04.2021