Как оставаться на связи через мобильную сеть после подключения WIFI на Android?
Я заметил, что во время потоковой передачи аудио с удаленного сервера через 3G (мобильное) соединение и когда WIFI отключен или выключен, как только WIFI активируется и подключается, соединение через 3G прерывается.
Я хочу, чтобы приложение продолжало использовать 3G, даже если сейчас подключен WIFI. Я хочу сделать это, чтобы сохранить преемственность. (Пользователь может включить / отключить это поведение).
Для этого есть специальный флаг, замок и т. Д.?
1 ответ
Это невозможно на устройствах до Android 5.0 (Lollipop). ОС поддерживает только один интерфейс за раз, и приложения не имеют никакого контроля над этим выбором.
На устройствах под управлением Android 5.0 или более поздней версии вы можете использовать новые многосетевые API для выбора интерфейса, который вы хотите использовать для сетевого трафика.
Вот шаги, чтобы сделать это, из журнала изменений Android 5.0:
Для динамического выбора и подключения к сети из вашего приложения выполните следующие действия:
- Создать
ConnectivityManager
,- Использовать
NetworkRequest.Builder
класс для созданияNetworkRequest
Объект и укажите сетевые функции и тип транспорта, который интересует ваше приложение.- Чтобы найти подходящие сети, позвоните
requestNetwork()
или жеregisterNetworkCallback()
и передать вNetworkRequest
объект и реализацияConnectivityManager.NetworkCallback
, ИспользоватьrequestNetwork()
метод, если вы хотите активно переключаться на подходящую сеть после ее обнаружения; чтобы получать уведомления только для сканируемых сетей без активного переключения, используйтеregisterNetworkCallback()
метод вместо.Когда система обнаруживает подходящую сеть, она подключается к сети и вызывает обратный вызов onAvailable(). Вы можете использовать объект Network из обратного вызова, чтобы получить дополнительную информацию о сети или направить трафик для использования выбранной сети.
В частности, если вы хотите форсировать свой трафик через 3G/LTE, даже если присутствует сигнал WiFi, вы должны использовать что-то вроде этого:
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(
Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder req = new NetworkRequest.Builder();
req.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
cm.requestNetwork(req.build(), new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
// If you want to use a raw socket...
network.bindSocket(...);
// Or if you want a managed URL connection...
URLConnection conn = network.openConnection(...);
}
// Be sure to override other options in NetworkCallback() too...
}