Android: данные, передаваемые по радио и Wi-Fi
Можно ли заставить приложение Android использовать только мобильное радиосоединение (3g/4g/etc), запрещая использование Wi-Fi?
Я думаю, что хочу использовать соединение HIPRI: (например: WIFI включен, используйте HIPRI 3G):
http://groups.google.com/group/android-developers/browse_thread/thread/d41f85505484d29b
Ответы
Ответ 1
Я не верю, что вы можете "принудительно" подключить путь без явного отключения 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);
Надеюсь, что это поможет!
Ответ 2
В 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
Вы можете проверить этот ответ: fooobar.com/questions/178346/...
Это НЕ хорошая политика... используйте ее, если ДЕЙСТВИТЕЛЬНО необходимо!
Ответ 3
ConnectivityManager.setNetworkPreference() близок к устареванию. Но что более важно, если вы доработаете getNetworkPreference() перед изменением, оно вернет ConnectivityManager.TYPE_MOBILE. Установка его там не имеет никакого значения. Что касается самого HIPRI, он работает в довольно странном режиме. Во-первых, он позволяет подключаться ко всем хостам, а не только к тем, которые явно запрашиваются. Во-вторых, когда вы выключаете его при вызове stopUsingFeature...(), он не будет отключен и будет оставаться активным. В-третьих, все приложения устройств начинают использовать его, даже если Wi-Fi доступен, что противоречит тому, что сказано в документации.
Ответ 4
(я ответил на тот же вопрос здесь)
Вы не можете принудительно принудительно использовать канал связи для каждого приложения (вы можете запросить использовать предпочтительный режим через ConnectivityManager.setNetworkPreference(...)
, но это не "форсирование" ).
Хотя это, вероятно, ужасный UX, вы можете сообщить пользователю, что ваше приложение запрещает использование Wi-Fi, а затем отключает их Wi-Fi, если они хотят продолжить. Для этого вам необходимы разрешения 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);
Ответ 5
Попробуйте взглянуть на это, у него много информации и может найти решение, которое вы ищете: Как использовать 3G-соединение в приложении Android вместо Wi-fi?
У этого есть пример рабочего сервиса, который устанавливает мобильное соединение HIPRI и поддерживает его. AFAIK это единственный более или менее простой способ работать с Wi-Fi и 3g в android. Единственным недостатком является то, что это соединение позволит только передавать данные серверам, на которые явно запрашивалась маршрутизация. Это в основном означает, что вы не можете маршрутизировать на многие серверы, потому что поиск по имени для получения IP-адреса требует времени, а его выполнение для 10 серверов займет 30-60 секунд, что заставляет его начинать медленно. Поэтому вы должны точно знать, какие серверы должны быть доступны через мобильное соединение.