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