我正在开发一个物联网应用程序,其中有一个登机过程,用户连接到一个没有互联网连接的接入点,配置设备然后连接到他的家庭Wifi网络 .
Android 8设备已导致一些问题,与接入点断开连接并重新连接到先前配置的网络 . 我假设这与Android 8中引入的连接更新有关,来自this link中的无缝连接部分:
在兼容设备上,当附近有高质量的网络时自动激活Wi-Fi .
我的问题是如何禁用此行为,因为我需要保持连接到接入点,没有互联网连接,并完成登机过程 .
我遇到过同样的问题 . 我所做的是在登机过程中添加一个步骤,我邀请用户前往那里设置,手动添加没有数据的网络并接受系统显示的弹出窗口 .
我还没有找到真正的解决方案 . 但是,我见过一个名为eWeLink的应用程序,他们设法做到这一点,但它不是一个开源项目 .
我目前正在面对Android 8的新款手机同样的问题 . 我正在使用WifiManager调用 bindProcessToNetwork here这将允许数据流量通过wifi无法访问互联网,
bindProcessToNetwork
这里我如何将手机连接到接入点
//Method to connect to WIFI Network public boolean connectTo(String networkSSID, String key) { WifiConfiguration config = new WifiConfiguration(); WifiInfo info = wifi.getConnectionInfo(); //get WifiInfo int id = info.getNetworkId(); //get id of currently connected network config.SSID = "\"" + networkSSID + "\""; if (key.isEmpty()) { config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); } int netID = wifi.addNetwork(config); int tempConfigId = getExistingNetworkId(config.SSID); if (tempConfigId != -1) { netID = tempConfigId; } boolean disconnect = wifi.disconnect(); wifi.disableNetwork(id); //disable current network boolean enabled = wifi.enableNetwork(netID, true); boolean connected = wifi.reconnect(); if (((Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)) || ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) && !(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M))) { final ConnectivityManager manager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkRequest.Builder builder; builder = new NetworkRequest.Builder(); //set the transport type do WIFI builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI); manager.requestNetwork(builder.build(), new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { manager.bindProcessToNetwork(network); } else { ConnectivityManager.setProcessDefaultNetwork(network); } try { } catch (Exception e) { e.printStackTrace(); } manager.unregisterNetworkCallback(this); } }); }
连接到设备创建的接入点后,它将不断从设备中脱落 .
只是想在讨论中添加一些内容 . 我已经使用bindProcessToNetwork一段时间了,它确实在连接到没有网络的时候修复了WiFi的损失,如Shawn Chen所描述的那样 . 这是一个沉重的解决方案,使得难以同时使用移动网络 . 然而,路由层在Android大约6点左右被破坏,即使路由表指示wifi设备,它们也开始强制请求移动 .
无论如何,你实际上可以在我下面描述的套接字级别绑定 . 当进程绑定到WiFi网络并且您仍然想要使用移动设备时,这可能会有所帮助 . 您不必查找WiFi(我正在尝试而不是绑定过程),而是查找移动“网络”对象并为其构建套接字 .
我们需要的是指示android不要丢弃WiFi连接的东西 .
HttpUrlConnection不允许您获取套接字,因此您可以使用okhttp在每个连接级别执行此操作 . 我使用的是OkHttp的2.7.5,但它与OkHttp的3版非常相似 .
您将获得当前网络然后处理每个网络以查找WiFi网络 .
Network[] networks = connectivityManager.getAllNetworks();
然后你 Build 的网址如下:
String url = "http://someurl"; HttpUrlConnection uconn = new OkUrlFactory( new OkHttpClient().setSocketFactory(network.getSocketFactory())).open(url)
这一切都适用于一些连接,有时它适用于我使用的一系列连接 . Android正在使用通过网络发生活动的知识,但任何暂停都会跳回到使用移动设备 . Android 9 wifi只是有缺陷,并没有弄清楚如何使用套接字解决方案使其粘性 . 可能有一个 .
我有同样的问题 . 这是我在Android 8设备中解决此问题的方法 . 1.由于Android 8设备在WiFI和蜂窝设备之间自动切换 . 我删除了以下代码 . 即代码强制转移到wifi .
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { NetworkRequest.Builder request = new NetworkRequest.Builder(); Log.i("forceCellularConnection","request WIFI enable"); request.addCapability(NetworkCapabilities.TRANSPORT_WIFI); connectivityManager.requestNetwork(request.build(), new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { connectivityManager.setProcessDefaultNetwork(network); connectivityManager.bindProcessToNetwork(network); } } }); }
this.wifiManager.disableNetwork(configuration.networkId); this.wifiManager.removeNetwork(configuration.networkId); this.wifiManager.saveConfiguration(); // Not needed in API level 26 and above
我尝试并帮助我进行连接工作的解决方法如下:在我的情况下,我还必须连接没有互联网的WiFi . 它是一个点对点连接 .
new CountDownTimer(16000, 2000) {
private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); Log.d("WifiReceiver", ">>>>SUPPLICANT_STATE_CHANGED_ACTION<<<<<<"); SupplicantState supl_state = ((SupplicantState) intent .getParcelableExtra(WifiManager.EXTRA_NEW_STATE)); switch (supl_state) { case ASSOCIATED: Log.i("SupplicantState", "ASSOCIATED"); // authMsg = "ASSOCIATED"; break; case ASSOCIATING: // authMsg = "ASSOCIATING"; Log.i("SupplicantState", "ASSOCIATING"); break; case AUTHENTICATING: // authMsg = "AUTHENTICATING"; Log.i("SupplicantState", "Authenticating..."); break; case COMPLETED: authMsg = "CONNECTED"; Log.i("SupplicantState", "Connected"); final ConnectivityManager connection_manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkRequest.Builder request = new NetworkRequest.Builder(); request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI); connection_manager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { ConnectivityManager.setProcessDefaultNetwork(network); } }); break; case DISCONNECTED:
4 回答
我遇到过同样的问题 . 我所做的是在登机过程中添加一个步骤,我邀请用户前往那里设置,手动添加没有数据的网络并接受系统显示的弹出窗口 .
我还没有找到真正的解决方案 . 但是,我见过一个名为eWeLink的应用程序,他们设法做到这一点,但它不是一个开源项目 .
我目前正在面对Android 8的新款手机同样的问题 . 我正在使用WifiManager调用
bindProcessToNetwork
here这将允许数据流量通过wifi无法访问互联网,这里我如何将手机连接到接入点
连接到设备创建的接入点后,它将不断从设备中脱落 .
只是想在讨论中添加一些内容 . 我已经使用bindProcessToNetwork一段时间了,它确实在连接到没有网络的时候修复了WiFi的损失,如Shawn Chen所描述的那样 . 这是一个沉重的解决方案,使得难以同时使用移动网络 . 然而,路由层在Android大约6点左右被破坏,即使路由表指示wifi设备,它们也开始强制请求移动 .
无论如何,你实际上可以在我下面描述的套接字级别绑定 . 当进程绑定到WiFi网络并且您仍然想要使用移动设备时,这可能会有所帮助 . 您不必查找WiFi(我正在尝试而不是绑定过程),而是查找移动“网络”对象并为其构建套接字 .
我们需要的是指示android不要丢弃WiFi连接的东西 .
HttpUrlConnection不允许您获取套接字,因此您可以使用okhttp在每个连接级别执行此操作 . 我使用的是OkHttp的2.7.5,但它与OkHttp的3版非常相似 .
您将获得当前网络然后处理每个网络以查找WiFi网络 .
然后你 Build 的网址如下:
这一切都适用于一些连接,有时它适用于我使用的一系列连接 . Android正在使用通过网络发生活动的知识,但任何暂停都会跳回到使用移动设备 . Android 9 wifi只是有缺陷,并没有弄清楚如何使用套接字解决方案使其粘性 . 可能有一个 .
我有同样的问题 . 这是我在Android 8设备中解决此问题的方法 . 1.由于Android 8设备在WiFI和蜂窝设备之间自动切换 . 我删除了以下代码 . 即代码强制转移到wifi .
我尝试并帮助我进行连接工作的解决方法如下:在我的情况下,我还必须连接没有互联网的WiFi . 它是一个点对点连接 .