微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在 Android 中以编程方式连接到 Wifi AP

我实际上正在编写一些不会让用户访问 android 原生 wifi 连接页面的东西,所以我在我的 Android 应用程序中对其进行了编程。它会扫描可用的 Wifi 网络,将其显示在 ListView 中,然后您单击要连接的网络。

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

 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)

解决方法

在@LevM 的帮助下,这里是现在可以工作的完整代码。和一点自我研究。我发布它是因为我没有找到很多解决方案来连接到互联网上的 Android 中的特定 Wifi 网络(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();

    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。