Android: принудительная отправка данных по радио и Wi-Fi

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

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

5 ответов

Я не верю, что вы можете "форсировать" путь соединения без явного временного отключения радио 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);

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

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

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

Источник: http://code.google.com/p/android/issues/detail?id=5885

Вы можете проверить этот другой ответ: /questions/5784486/kak-ispolzovat-3g-soedinenie-v-prilozhenii-dlya-android-vmesto-wi-fi/5784500#5784500

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

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

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

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

Хотя это, вероятно, ужасный UX, вы можете сообщить пользователю, что ваше приложение запрещает использовать 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);

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

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

Другие вопросы по тегам