我正在开发一个物联网应用程序,其中有一个登机过程,用户连接到一个没有互联网连接的接入点,配置设备然后连接到他的家庭Wifi网络。
Android 8设备导致一些问题,断开与接入点的连接并重新连接到先前配置的网络。我假设这与Android 8中引入的连接更新有关,来自this link中的无缝连接部分:
在兼容设备上,当高时自动激活Wi-Fi 质量保存的网络就在附近。
我的问题是如何禁用此行为,因为我需要保持与接入点的连接,没有互联网连接,并完成登机过程。
答案 0 :(得分:1)
我有同样的问题。我所做的是在登机过程中添加一个步骤,我邀请用户前往那里设置,手动添加没有数据的网络,并接受系统显示的弹出窗口。
我还没有找到真正的解决方案。 但是,我已经看到了一个名为eWeLink的应用程序,他们设法做到这一点,但它不是一个开源项目。
答案 1 :(得分:1)
我目前面临的问题是适用于Android 8. +的新款手机。我正在使用WifiManager呼叫bindProcessToNetwork
here这将允许数据流量通过wifi而无法访问互联网,
此处我将手机连接到接入点
//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);
}
});
}
连接到设备创建的接入点后,它将不断从设备上掉线。
答案 2 :(得分:1)
我有同样的问题。这就是我在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);
}
}
});
}
还添加了以下代码,以便在建立新连接之前忘记wifi连接。设备断开WiFI连接需要花费一些时间。因此,我在连接到新的WIFI SSID之前增加了延迟。
this.wifiManager.disableNetwork(configuration.networkId);
this.wifiManager.removeNetwork(configuration.networkId);
this.wifiManager.saveConfiguration(); // Not needed in API level 26 and above
我尝试并帮助我进行连接工作的解决方法如下:就我而言,我还必须连接没有互联网的WiFi。它是对等连接。
我进行了2-3次连接尝试
new CountDownTimer(16000, 2000) {
我还写了下面的广播接收器来检查WiFI的状态。然后建立连接。
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:
答案 3 :(得分:1)
只想在讨论中增加一点。我一直在使用bindProcessToNetwork一段时间,它确实解决了Shawn Chen所描述的在没有网络的情况下连接到WiFi时WiFi丢失的问题。这是一个繁重的解决方案,因此很难同时使用移动网络。但是,在Android上大约6点左右的位置,路由层已被破坏,即使路由表显示了wifi设备,他们也开始向移动设备强制请求。
无论如何,您实际上可以在我下面描述的套接字级别进行绑定。当该过程已绑定到WiFi网络并且您仍想使用移动设备时,这可能会有所帮助。无需查找WiFi(这是我正在尝试的方法,而不是绑定此过程),而是查找移动的“网络”对象并为其建立套接字。
我们需要的是指示android不要断开WiFi连接的东西。
HttpUrlConnection不允许您获取套接字,因此您可以使用okhttp在每个连接级别上进行操作。我正在使用OkHttp的2.7.5,但是对于OkHttp的3+版本来说,非常相似。
获得当前网络,然后处理每个网络以找到WiFi网络。
Network[] networks = connectivityManager.getAllNetworks();
然后您按照以下方式构建网址:
String url = "http://someurl";
HttpUrlConnection uconn = new OkUrlFactory( new OkHttpClient().setSocketFactory(network.getSocketFactory())).open(url)
这对于一些连接都可以正常工作,有时对我使用的一系列连接也可以工作。 Android使用的知识是网络上正在发生活动,但活动会暂停,然后会跳回使用移动设备。 Android 9 wifi只是有缺陷,还没有弄清楚如何使用套接字解决方案使其具有粘性。可能有一个。