Подключиться к локальной сети и интернету одновременно?

Проще говоря, я хочу использовать свое Android-устройство для подключения к локальной сети, но при этом не потерять возможности Интернета.

Я просмотрел руководства Google по сетевым подключениям, но единственное возможное решение, которое я нашел, — это Wi-Fi Direct. К сожалению, я не думаю, что это возможно, потому что локальная сеть не поддерживает протокол Wi-Fi Direct.

Есть ли способ подключиться к точке доступа Wi-Fi без Интернета и оставаться подключенным либо к сотовой связи, либо к предыдущей точке доступа Wi-Fi, у которой есть Интернет?

Я могу перенастроить локальную сеть, если это поможет.

Изменить: я видел time-on-a?rq=1">этот вопрос, но похоже, что на него нет ответа, и он был задан более 3 лет назад


person Daiwik Daarun    schedule 30.07.2015    source источник
comment
Первый ответ на вопрос, на который вы ссылаетесь, должен делать то, что вы хотите.   -  person alex    schedule 30.07.2015
comment
Какой/как? Я хочу, чтобы пользователь подключался в приложении к локальной сети и, все еще подключенный к локальной сети, имел возможности Интернета вне приложения (например, в Chrome)   -  person Daiwik Daarun    schedule 30.07.2015
comment
Извините, не прочитал другой ответ достаточно внимательно. Я добавлю правильный ответ ниже.   -  person alex    schedule 30.07.2015


Ответы (1)


Вам нужно создать HttpClient, который знает, что нужно использовать только WiFi.

Android проверит интернет-соединения, чтобы узнать, может ли он подключиться к Интернету с ними, и проигнорирует их, если не сможет. Даже для локальных IP-адресов, что может быть проблемой.

Это часть модуля Dagger, который я написал для создания правильно настроенного клиента OkHttp.

/**
 * Find the WiFi Network object. If the WiFi is off this will return null. You might want to listen to the broadcasts from the WiFi system to retry when the WiFi is turned on.
 */
@Provides
public Network provideNetwork(ConnectivityManager connectivityManager) {
    for (final Network network : connectivityManager.getAllNetworks()) {
        final NetworkInfo networkInfo = connectivityManager.getNetworkInfo(network);
        final int networkType = networkInfo.getType();

        if (networkType == ConnectivityManager.TYPE_WIFI) {
            return network;
        }
    }

    return null;
}


/**
 * Create a HttpClient that will only use the network supplied. Changing this for the built in Apache HttpClient should be easy enough. 
 */
@Provides
public OkHttpClient provideOkHttpClient(final Network network) {
    if (network != null) {
        final OkHttpClient httpClient = new OkHttpClient();
        httpClient.setSocketFactory(network.getSocketFactory());

        Internal.instance.setNetwork(httpClient, new com.squareup.okhttp.internal.Network() {
            @Override
            public InetAddress[] resolveInetAddresses(String host) throws UnknownHostException {
                return network.getAllByName(host);
            }
        });

        return httpClient;
    }

    return null;
}
person alex    schedule 30.07.2015
comment
Я немного запутался... Похоже, provideNetwork захватывает уже существующее сетевое соединение Wi-Fi. Это может сработать, но в нынешнем виде первоначальное подключение к локальной сети прерывает мое интернет-соединение (Android пытается получить доступ к Интернету через локальную сеть в других приложениях). Это позволяет избежать этой проблемы? - person Daiwik Daarun; 30.07.2015
comment
Какую версию Android вы используете? - person alex; 30.07.2015
comment
Этот код создает только HttpClient, который использует только Wi-Fi, он не подключается ни к каким сетям. - person alex; 30.07.2015
comment
Спасибо за быстрый ответ! Я использую Android L. Вы имеете в виду, что возвращенный OkHttpClient может сканировать доступные сети и подключаться исключительно к определенной (например, локальной сети)? Другими словами, мое текущее интернет-соединение не будет затронуто, потому что эта сеть не будет нарушена. - person Daiwik Daarun; 30.07.2015
comment
Этот HttpClient будет использовать Wi-Fi только для передачи данных. Ничего общего с сетью, к которой подключен Wi-Fi. Чтобы выбрать сеть WiFi для подключения, см. Диспетчер WiFi. developer.android.com/reference/android/net/wifi/ - person alex; 30.07.2015
comment
Кажется, я вижу проблему (поправьте меня, если я неправильно понял). То, что вы описываете, будет передавать данные через WiFi. То, что я хочу сделать, это подключиться к двум сетям одновременно - одна для локальной сети и одна для Интернета. - person Daiwik Daarun; 30.07.2015
comment
В порядке. Я надеялся, что это можно будет сделать, если подключение к Интернету не используется в одной из сетей (аналогично тому, как вы можете использовать Wi-Fi Direct и при этом оставаться подключенным к сети). - person Daiwik Daarun; 30.07.2015