Как оставаться на связи через мобильную сеть после подключения WIFI на Android?

Я заметил, что во время потоковой передачи аудио с удаленного сервера через 3G (мобильное) соединение и когда WIFI отключен или выключен, как только WIFI активируется и подключается, соединение через 3G прерывается.

Я хочу, чтобы приложение продолжало использовать 3G, даже если сейчас подключен WIFI. Я хочу сделать это, чтобы сохранить преемственность. (Пользователь может включить / отключить это поведение).

Для этого есть специальный флаг, замок и т. Д.?

1 ответ

Решение

Это невозможно на устройствах до Android 5.0 (Lollipop). ОС поддерживает только один интерфейс за раз, и приложения не имеют никакого контроля над этим выбором.

На устройствах под управлением Android 5.0 или более поздней версии вы можете использовать новые многосетевые API для выбора интерфейса, который вы хотите использовать для сетевого трафика.

Вот шаги, чтобы сделать это, из журнала изменений Android 5.0:

Для динамического выбора и подключения к сети из вашего приложения выполните следующие действия:

  1. Создать ConnectivityManager,
  2. Использовать NetworkRequest.Builder класс для создания NetworkRequest Объект и укажите сетевые функции и тип транспорта, который интересует ваше приложение.
  3. Чтобы найти подходящие сети, позвоните 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...

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