我正在寻找一种让Android 5.0平板电脑连接到内部网的方法,出于安全考虑,该内部网没有互联网连接.
问题是谷歌自4.4/5.0以来在Android中构建的强制门户保护.对android connectivitycheck进行调用以检查互联网连接,当此呼叫失败时,wifi网络被标记为不工作并避免.很蹩脚.
其他人遇到了同样的问题,有些人建议使用android 5中引入的新API,请参阅: Android 5.0 Lollipop和4.4 KitKat忽略了我的WiFi网络,enableNetwork()无用
关于此的文件非常含糊:
NetworkRequest.Builder.setNetworkSpecifier(String networkSpecifier)
"对此字符串的解释是特定于承载的,使用它的承载者应记录其详细信息.例如,蓝牙可能使用某种设备ID,而WiFi可能使用ssid和/或bssid.蜂窝可能使用载波spn"
我试过这个并没有用.主要问题是,一旦我使用 setNetworkSpecifier()
没有网络被发现.我尝试使用bssid
(mac)和ssid
AP.
看起来过滤器正在工作,但不清楚它应该如何工作.如果我省略了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); } }
EricRobertBr.. 5
我调试了以下代码,这些代码在Android Studio的API 23(6.0.1)的Samsung S5(SM-G900V)上运行。
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
:
也许networkSpecifier
S对于WIFI
-transport网络将在未来实施......为了记录在案,我发现,networkSpecifier
被设置为1
这个特殊的电话上为现有CELLULAR
-transport网络。
就目前而言,addCapability
在请求Wi-Fi网络时,似乎最好的呼叫方是最佳选择。
我调试了以下代码,这些代码在Android Studio的API 23(6.0.1)的Samsung S5(SM-G900V)上运行。
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
:
也许networkSpecifier
S对于WIFI
-transport网络将在未来实施......为了记录在案,我发现,networkSpecifier
被设置为1
这个特殊的电话上为现有CELLULAR
-transport网络。
就目前而言,addCapability
在请求Wi-Fi网络时,似乎最好的呼叫方是最佳选择。