首页 文章

奥利奥Wifi连接

提问于
浏览
10

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

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

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

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

4 回答

  • 1

    我遇到过同样的问题 . 我所做的是在登机过程中添加一个步骤,我邀请用户前往那里设置,手动添加没有数据的网络并接受系统显示的弹出窗口 .

    我还没有找到真正的解决方案 . 但是,我见过一个名为eWeLink的应用程序,他们设法做到这一点,但它不是一个开源项目 .

  • 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);
                        }
                    });
                }
    

    连接到设备创建的接入点后,它将不断从设备中脱落 .

  • 1

    只是想在讨论中添加一些内容 . 我已经使用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只是有缺陷,并没有弄清楚如何使用套接字解决方案使其粘性 . 可能有一个 .

  • 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);
                    }
               }
         });
    
    }
    
    • 在我们 Build 新连接之前,还添加了以下代码以忘记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的状态 . 然后 Build 连接 .
    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:
    

相关问题