Как указать Wi-Fi-сеть с помощью NetworkRequest.Builder (). SetNetworkSpecifier (string)

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

Проблема заключается в недоступной защите портала, которую Google создает в андроиде с 4.4 / 5.0. Вызов выполняется для подключения к подключению Android для проверки подключения к Интернету, когда этот вызов не выполняется, сеть Wi-Fi отмечена как не работающая и предотвращенная. Довольно хромой.

Другие сталкиваются с той же проблемой, и некоторые предлагают использовать новый API, представленный в android 5, см .: Android 5.0 Lollipop и 4.4 KitKat игнорирует мою сеть WiFi, enableNetwork () бесполезна

Документация по этому вопросу очень расплывчата:

NetworkRequest.Builder.setNetworkSpecifier(String networkSpecifier) 

«Интерпретация этой строки носит специфический характер и носители, которые используют ее, должна документировать свои данные. Например, Bluetooth может использовать какой-то идентификатор устройства, в то время как WiFi может использовать ssid и / или bssid. Сотовая связь может использовать оператор spn"

Я пробовал это, и он не работает. Основная проблема заключается в том, что после использования setNetworkSpecifier() сеть не найдена. Я попытался использовать bssid (mac) и ssid из AP.

Похоже, фильтр работает, но неясно, как он должен работать. Если я не setNetworkSpecifier() вызывать сеть setNetworkSpecifier() найдена сеть 1, но определить, какой из них определить невозможно. По крайней мере, это показывает, что мой код работает.

Итак, что я должен здесь вводить, если ssid и bssid не работают?

Вот мой код.

  private void connect(String ssid, Context context) { Log.i(TAG, "try connect to! " + ssid); ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkRequest nr = new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI). removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED). removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET setNetworkSpecifier(ssid). //<--- here is the problem build(); ConnectivityManager.NetworkCallback callback = new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Log.i(TAG, "onAvailable " + network.toString() + " " + network.getClass().getName()); } } @Override public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) { try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Log.i(TAG, "onCapabilitiesChanged " + networkCapabilities.getLinkDownstreamBandwidthKbps()); } } catch (Exception e) { e.printStackTrace(); } } @Override public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) { try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Log.i(TAG, "onLinkPropertiesChanged " + linkProperties.getInterfaceName()); } } catch (Exception e) { e.printStackTrace(); } } }; Log.i(TAG, "requestNetwork "); // cm.requestNetwork(nr, callback); cm.registerNetworkCallback(nr, callback); } } 

Solutions Collecting From Web of "Как указать Wi-Fi-сеть с помощью NetworkRequest.Builder (). SetNetworkSpecifier (string)"

Прежде всего, обман – это всегда вариант и просто требуется, чтобы люди меняли свои настройки в телефоне, чтобы работать с сетью. Чит идет так. Wifi-> дополнительно-> Неконтролируемый.

Тем не менее, я уверен, что это не тот ответ, который вы ищете. Поэтому я сделал небольшое исследование для вас и нашел, что нужно. Вам нужно вызвать команду ignoreNetwork (). Чтобы узнать больше об этой команде, она находится в ACTION_CAPTIVE_PORTAL_SIGN_IN по следующей ссылке источника.

Источник: http://developer.android.com/reference/android/net/ConnectivityManager.html#ACTION_CAPTIVE_PORTAL_SIGN_IN

http://developer.android.com/reference/android/net/CaptivePortal.html#ignoreNetwork ()

Я отлаживал следующий код, запущенный на Samsung S5 (SM-G900V), API 23 (6.0.1) в Android Studio.

 void inspectNetworks() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { ConnectivityManager connectivity = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); Network[] ns = connectivity.getAllNetworks(); for (Network n : ns) { NetworkCapabilities c = connectivity.getNetworkCapabilities(n); Log.i(TAG, "inspectNetworks: network="+n+" capabilities="+c); // <- breakpoint } } } 

Я обнаружил, что Wi-Fi-сети вообще не имеют никакого networkSpecifier :

В представлении Android Studio Debug, mNetworkSpecifier = null

Может быть, networkSpecifier s для сетей WIFI -транспорта будет реализован в будущем … Для записи я обнаружил, что для networkSpecifier установлено значение 1 на этом телефоне для существующих сетей CELLULAR-transports.

На данный момент это похоже на то, чтобы быть максимально конкретным, поскольку призывы к addCapability – лучший вариант при запросе сети Wi-Fi.