如何使用NetworkRequest.Builder()指定wifinetworking。setNetworkSpecifier(string)

我正在寻找一种方法让Android 5.0平板电脑连接到没有互联网连接的Intranet,出于安全原因。

问题是Google自4.4 / 5.0版在android中build立的强制门户保护。 拨打电话到android connectivitycheck检查互联网连接,当这个呼叫失败时,wifinetworking被标记为不工作并且被避免。 很蹩脚。

其他人遇到同样的问题,并build议使用Android 5中引入的新API,请参阅: Android 5.0 Lollipop和4.4 KitKat忽略我的WiFinetworking,enableNetwork()是无用的

关于这个文件非常模糊:

NetworkRequest.Builder.setNetworkSpecifier(String networkSpecifier) 

“这个string的解释是持证人的具体情况,使用它的持证人应该logging他们的细节,例如,蓝牙可能使用某种设备ID,而WiFi可以使用ssid和/或bssid。蜂窝可以使用运营商spn”

我试过这个,它不工作。 主要的问题是,一旦我使用setNetworkSpecifier()没有findnetworking。 我尝试使用bssid (mac)和AP的ssid

它看起来像filter正在工作,但不清楚它应该如何工作。 如果我省略setNetworkSpecifier()调用1findnetworking,但不可能确定哪个。 至less它显示我的代码工作。

那么,如果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 "如何使用NetworkRequest.Builder()指定wifinetworking。setNetworkSpecifier(string)"

首先作弊是永远的select,只需要人们改变他们在手机上的设置,以便与networking一起工作。 骗子是这样的。 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(&#xFF09;

我在Android Studio中debugging了三星S5(SM-G900V),API 23(6.0.1)上运行的以下代码。

 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-Finetworking根本没有任何networkSpecifier

在Android Studio调试视图中,mNetworkSpecifier = null

也许networkSpecifierWIFI传输networking将在未来实施…logging,我发现networkSpecifier 设置为1在这个特定的手机现有的networkSpecifiernetworking。

就目前而言,在请求Wi-Finetworking时,调用addCapability是最好的select。