Android: принудительно отправлять данные по радио и WiFi - PullRequest
14 голосов
/ 04 мая 2011

Можно ли заставить приложение Android использовать только мобильную радиосвязь (3g / 4g / etc), запретив использование WiFi?

Я думаю, что хочу использовать соединение HIPRI: (например: WIFI включен, используйте HIPRI 3G): http://groups.google.com/group/android-developers/browse_thread/thread/d41f85505484d29b

Ответы [ 5 ]

10 голосов
/ 04 мая 2011

Я не верю, что вы можете «форсировать» путь соединения, не отключив радиостанцию ​​Wi-Fi явно (не рекомендуется). Тем не менее, вы можете попытаться установить сетевые настройки в тот период, когда вы хотите, чтобы это произошло:

ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
//Prefer mobile over wifi
cm.setNetworkPreference(ConnectivityManager.TYPE_MOBILE);

//Do your work

//Remove your preference
cm.setNetworkPreference(ConnectivityManager.DEFAULT_NETWORK_PREFERENCE);

Надеюсь, что поможет!

4 голосов
/ 20 марта 2012

В Android 2.2 вы можете использовать высокоприоритетные мобильные данные одновременно с WiFi.Значение параметра «feature» равно «enableHIPRI» и скрыто в API телефона.

Метод: ConnectivityManager.startUsingNetworkFeature (int networkType, функция String), равный http://developer.android.com/reference/android/net/ConnectivityManager.html

Source: http://code.google.com/p/android/issues/detail?id=5885

Вы можете проверить этот другой ответ: https://stackoverflow.com/a/4756630/327011

Это НЕ хорошая политика ... используйте ее, если ДЕЙСТВИТЕЛЬНО нужно!

1 голос
/ 26 ноября 2013

ConnectivityManager.setNetworkPreference () близок к устареванию.Но что более важно, если вы выполните getNetworkPreference () перед изменением, он вернет ConnectivityManager.TYPE_MOBILE.Установка там не имеет никакого значения.Что касается самого HIPRI, он работает в довольно странном режиме.Во-первых, он разрешает соединения со всеми хостами, а не только с явно запрашиваемыми.Во-вторых, когда вы отключите его с помощью вызова stopUsingFeature ... (), он не будет отключен и будет по-прежнему активным.В-третьих, все приложения для устройств начинают использовать его, даже если доступен Wi-Fi, что противоречит тому, что сказано в документации.

0 голосов
/ 22 декабря 2013

Попробуйте взглянуть на это, оно содержит много информации и может иметь решение, которое вы ищете: Как использовать 3G-соединение в приложении для Android вместо Wi-Fi?

У него есть пример работающего сервиса, который устанавливает мобильное соединение HIPRI и поддерживает его работу.AFAIK это единственный более или менее простой способ иметь работающий Wi-Fi и 3G в Android.Единственным недостатком является то, что это соединение будет разрешать только передачу данных на серверы, на которые была явно запрошена маршрутизация.Это в основном означает, что вы не можете маршрутизировать на многие серверы, потому что поиск хоста по имени для получения IP-адреса занимает много времени, а для 10 серверов это займет 30-60 секунд, что заставляет его запускаться медленно.Поэтому вы должны точно знать, какие серверы должны быть доступны через мобильную связь.

0 голосов
/ 01 февраля 2012

(я ответил на этот же вопрос здесь )

Вы не можете явно форсировать канал связи для каждого приложения отдельно (вы можете запросить использование предпочтительного режима через ConnectivityManager.setNetworkPreference(...), но это не «принуждение»).

Хотя это, вероятно, ужасный UX, вы можете сообщить пользователю, что ваше приложение запрещает использовать WiFi, а затем отключить его WiFi, если они хотят продолжить.Для этого вам нужны разрешения ACCESS_WIFI_STATE и CHANGE_WIFI_STATE.Код будет выглядеть примерно так:

manager = (WifiManager)this.getSystemService(Context.WIFI_SERVICE);

if(manager.isWifiEnabled()) {
    manager.setWifiEnabled(false);
}
// and to be sure:
ConnectivityManager.setNetworkPreference(ConnectivityManager.TYPE_MOBILE);
...