Android Lollipop по умолчанию использует данные Mobile Data, когда Wi-Fi не имеет доступа в Интернет?

Android Lollipop по умолчанию используется для мобильных данных, когда к Wi-Fi, к которому вы подключены, не имеет доступа в Интернет. Кто-нибудь знает, где это официально зарегистрировано?

У нас есть приложение, которое должно подключаться к машинам через Wi-Fi, у которых нет Интернета. Теперь наши клиенты сообщают, что соединение Wi-Fi больше не работает, поскольку телефон автоматически переключается на LTE.

Мое понимание было бы в том, что телефон по-прежнему поддерживает соединение Wi-Fi, но использует LTE в дополнение к обеспечению доступа к Интернету (lollipop-feature-spotlight-android-now-defaults-to-mobile-data-when-wi-fi-has-no-internet-access-signal-icon-adds-a-for-no-connection).

Я понимаю, что это неправильно? И если да, то есть ли способ заставить использовать Wi-Fi без Интернета? Я не мог найти ничего об этом, в частности, в документации разработчика.

Любая помощь действительно оценена.

Ответы

Ответ 1

Чтобы расширить ответ на @ianhanniballake, я обнаружил, что привязка сети с помощью ConnectivityManager.setProcessDefaultNetwork() предотвращает роуминг и позволяет использовать полный TCP доступ. Таким образом, в обратном вызове onAvailable() вы можете связать процесс приложения с этой сетью, а не открывать соединение с определенным URL-адресом.

ConnectivityManager connection_manager = 
    (ConnectivityManager) activity.getApplication().getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkRequest.Builder request = new NetworkRequest.Builder();
request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);

connection_manager.registerNetworkCallback(request.build(), new NetworkCallback() {

    @Override
    public void onAvailable(Network network) {
        ConnectivityManager.setProcessDefaultNetwork(network);
    }
}

Ответ 2

По умолчанию Android 5.0 будет отправлять только сетевые запросы по сетям, которые он обнаруживает, имеет активное интернет-соединение, поэтому, когда он может быть "подключен" к Wi-Fi, он не собирается отправлять какие-либо данные по сети.

Однако API 5.0 для Android 5.0 говорит о новой поддержке нескольких сетей:

Android 5.0 предоставляет новые мультисервисные API, позволяющие вашему приложению динамически сканировать доступные сети с определенными возможностями и устанавливать соединение с ними. Эта функциональность полезна, когда вашему приложению требуется специализированная сеть, такая как SUPL, MMS или сеть биллинга оператора, или если вы хотите отправлять данные с использованием определенного типа транспортного протокола.

Это позволяет вам создать NetworkRequest для TRANSPORT_WIFI и прямой трафик на него через Network.openConnection(), когда вы получаете onAvailable() обратный вызов, если вы должны иметь определенные подключения к Wi-Fi, даже если Wi-Fi-сеть не имеет доступа в Интернет.

Ответ 3

Android 5.0 предоставляет новые мультисервисные API, позволяющие вашему приложению динамически сканировать доступные сети с определенными возможностями и устанавливать соединение с ними. Подробнее здесь

Таким образом, решение для вас - ConnectivityManager.requestNetwor().