奥利奥Wifi连接

时间:2018-03-19 12:38:22

标签: android iot android-wifi wifimanager

我正在开发一个物联网应用程序,其中有一个登机过程,用户连接到一个没有互联网连接的接入点,配置设备然后连接到他的家庭Wifi网络。

Android 8设备导致一些问题,断开与接入点的连接并重新连接到先前配置的网络。我假设这与Android 8中引入的连接更新有关,来自this link中的无缝连接部分:

  

在兼容设备上,当高时自动激活Wi-Fi   质量保存的网络就在附近。

我的问题是如何禁用此行为,因为我需要保持与接入点的连接,没有互联网连接,并完成登机过程。

4 个答案:

答案 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);
                }
           }
     });

}
  1. 还添加了以下代码,以便在建立新连接之前忘记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。它是对等连接。

  1. 我进行了2-3次连接尝试

    new CountDownTimer(16000, 2000) {
    
  2. 我还写了下面的广播接收器来检查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只是有缺陷,还没有弄清楚如何使用套接字解决方案使其具有粘性。可能有一个。