当前位置: 首页 > 知识库问答 >
问题:

在Android中以编程方式连接到WiFi AP

佴普松
2023-03-14

我实际上是在编程一些东西,不让用户访问Android原生wifi连接页面,所以我在我的Android应用程序中编程。它扫描可用的无线网络,将其显示在列表视图中,然后单击要连接的网络。

事实上,除了我的连接功能之外,一切都很好,这使得我的应用程序崩溃,所以如果你有任何想法...下面是代码(这是用户输入网络通行证后调用的函数)和堆栈跟踪:

 private void connectToNetwork(String networkSSID, String networkPass, String networkCapabilities) {

        WifiConfiguration wifiConfig = new WifiConfiguration();
        wifiConfig.SSID =networkSSID;

        if (networkCapabilities.toUpperCase().contains("WEP")) { // WEP Network.
            Toast.makeText(this, "WEP Network", Toast.LENGTH_SHORT).show();

            wifiConfig.wepKeys[0] = networkPass;
            wifiConfig.wepTxKeyIndex = 0;
            wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
            wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
        } else if (networkCapabilities.toUpperCase().contains("WPA")) { // WPA Network
            Toast.makeText(this, "WPA Network", Toast.LENGTH_SHORT).show();
            wifiConfig.preSharedKey = networkPass;
        } else { // OPEN Network.
            Toast.makeText(this, "OPEN Network", Toast.LENGTH_SHORT).show();
            wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
        }

        @SuppressLint("MissingPermission")
        List<WifiConfiguration> list = this.wifiManager.getConfiguredNetworks();
        for (WifiConfiguration config : list) {
            if (config.SSID != null && config.SSID.equals(networkSSID)) {
                this.wifiManager.disconnect();
                this.wifiManager.enableNetwork(config.networkId, true);
                this.wifiManager.reconnect();
                break;
            }
        }

    }

堆栈跟踪:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.List android.net.wifi.WifiManager.getConfiguredNetworks()' on a null object reference
        at solutions.#####.############.WifiActivity.connectToNetwork(WifiActivity.java:148)

共有1个答案

仲孙温文
2023-03-14

这是在@LevM的帮助和一点自我研究之后,现在工作的完整代码。我张贴它,因为我没有找到太多的解决方案来连接到特定的WiFi网络在Android上的互联网(SO,YouTube或其他),所以如果它可以帮助至少一个开发一些天,我会很高兴!: D(注意:我是一个学生程序员,我不是说这个解决方案是最好的,但它是功能至少)

我的wifiManager没有初始化,这实际上是一个问题。然后我删除了wifiConfiguration列表循环,我意识到我不需要它。最后,我在SSID和密码上添加了字符串格式,因为它们需要在反斜杠(\)中。

private boolean connectToNetwork(String networkSSID, String networkPass, String networkCapabilities) {
        WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        WifiConfiguration wifiConfig = new WifiConfiguration();
        wifiConfig.SSID = String.format("\"%s\"", networkSSID);

        if (!wifiManager.isWifiEnabled()) {
            wifiManager.setWifiEnabled(true);
        }

        if (networkCapabilities.toUpperCase().contains("WEP")) { // WEP Network.
            Toast.makeText(this, "WEP Network", Toast.LENGTH_SHORT).show();

            wifiConfig.wepKeys[0] = String.format("\"%s\"", networkPass);
            ;
            wifiConfig.wepTxKeyIndex = 0;
            wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
            wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
        } else if (networkCapabilities.toUpperCase().contains("WPA")) { // WPA Network
            Toast.makeText(this, "WPA Network", Toast.LENGTH_SHORT).show();
            wifiConfig.preSharedKey = String.format("\"%s\"", networkPass);
            ;
        } else { // OPEN Network.
            Toast.makeText(this, "OPEN Network", Toast.LENGTH_SHORT).show();
            wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
        }


        int netId = wifiManager.addNetwork(wifiConfig);//  
        wifiManager.disconnect();
        wifiManager.enableNetwork(netId, true);
        return wifiManager.reconnect();

    }
 类似资料:
  • 目的尝试连接或切换到特定的WiFi网络,无需任何人为干预(用户名和密码除外)。 代码片段 主要活动。kt 类主活动:AppCompat活动(){ } AndroidManifest。xml权限 使用此代码,设备能够连接到WiFi网络,但需要手动关闭和打开WiFi。必须有更好的方法来连接或切换到特定的WiFi网络,而无需任何手动操作。 当前流程: 运行应用程序并单击主屏幕上的按钮连接到WiFi。 转

  • 以同样的方式,我想为OTG做这件事。

  • 我正在开发一个应用程序,其中我需要的第一件事是如何获得连接到我的wifi网络或相同wifi网络的设备。即IP地址、设备名称等。我不知道如何做到这一点已经搜索了很多,但没有可用的示例。 我做了一件事,我将ping 255个ip,无论哪个将响应,都将是连接的ip,但这里的问题是,有些网站已经分配了虚拟ip,因此我只需要检测真实的设备ip地址。 我想做与应用程序WifiTalkie中所做的相同的事情

  • 我在Android中以编程方式设置APN。当我运行代码时,我得到。如果我在清单中提到这个权限,我得到的错误就像这些权限只有SYSTEM APPS。你能帮我解决这个问题吗?参考链接

  • 我正在尝试通过利用AWS的websocket api网关在我的网站上实现用户之间的消息传递。我看到的每个指南/文档都说要使用wscat测试到网关的连接。我现在可以连接到api网关并使用wscat在客户机之间发送消息,但我正努力通过ts代码使它以编程方式工作。 我想做的是在用户登录后对websocket api网关进行api调用,这样他们就可以在任何时候发送消息。我的后端使用无服务器,前端使用Ang

  • 我正在用jsPlumb构建一个UI,因为我有多个可以连接在一起的盒子。每个框有1个目标和3个源,使用对同一个框DOM元素调用的和方法生成。 每个源通过将其连接到方框不同部分的过滤器属性进行区分: 只能在一个盒子的源和另一个盒子的目标之间进行连接。目标锚点是连续的。 这种安排非常适合我需要的东西,只要处理盒子和拖放连接。 当我想从JSON对象重新创建保存的UI时,问题就出现了。我可以毫无问题地重新创