以编程方式在 Android 中测试 WiFi 连接

10

我正在编写一个用于IoT设备的Android应用程序。我需要提供WiFi用户名和密码给设备,因此我使用了一个Android应用程序来完成这个任务。我有以下代码,但似乎无论是否给出正确的密码,它都总是连接到网络。

我正在使用与我的手机连接相同的AP进行测试。

期望的行为是:

断开当前AP连接->尝试使用给定的凭据连接->重新连接原始网络。

我需要采取哪些步骤才能正确验证wifi网络和密码?

代码:

WifiConfiguration conf = new WifiConfiguration();
    conf.SSID = "\"" + ssid + "\"";
    for(ScanResult sr: wifiList){
        if(sr.SSID.equals(ssid)){
            if(sr.capabilities.contains("WEP")){
                if(isNumeric(pass)){
                    conf.wepKeys[0] =  pass ;
                }else{
                    conf.wepKeys[0] = "\"" + pass + "\"";
                }
                conf.wepTxKeyIndex = 0;
                conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
                conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
            }else if(sr.capabilities.contains("PSK")){
                conf.preSharedKey = "\""+ pass +"\"";
            }else if(sr.capabilities.contains("EAP")){
                wifiName.setError("EAP networks not supported");
                //todo support EAP
            }else{
                conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
            }

            WifiManager wifiManager = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE);
            wifiManager.addNetwork(conf);

            List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
            for( WifiConfiguration i : list ) {
                if(i.equals(conf)) {
                    wifiManager.disconnect();
                    if(!wifiManager.enableNetwork(i.networkId, true)){
                        wifiPassword.setError("Incorrect Password");
                        wifiManager.reconnect();
                        return;
                    }else{
                        wifiManager.reconnect();
                        addUser(deviceSN, ssid, pass);
                    }
                }
            }

            break;
        }
    }

你修复了吗? 我也遇到了这个问题。如果我添加错误的密码也会返回true。所以你能提出解决这个问题的想法吗? - AngelJanniee
3个回答

4

您应该注册NETWORK_STATE_CHANGED_ACTION。

通过这样做,您可以获取WI-FI网络状态并需要检查其是否达到已连接状态。如果设备在一定的等待时间后仍未连接,则可以认为连接失败。

另一个有用的接收器可能是SUPPLICANT_STATE_CHANGED_ACTION。

public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {

            NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);

            switch (info.getState()) {
                case CONNECTING:
                    break;
                case CONNECTED:
                    break;
                case DISCONNECTING:
                    break;
                case DISCONNECTED:
                    break;
                case SUSPENDED:
                    break;
                }
            }

@iuliu.net 看,我认为你需要查看 getConnectionInfo。 https://developer.android.com/reference/android/net/wifi/WifiManager#getConnectionInfo() - Ilan.b
是的,但那并不能告诉你密码...我有以下情况:我已连接到X网络,尝试使用SSID/密码连接到X网络以检查正确性。然后按照您所说的做法:“如果设备在一定时间内未能连接成功,则可以假定连接失败。”。但操作系统无论我做什么都会告诉我它已经连接到X网络,因为它已经连接上了。 - iuliu.net
很抱歉,我不确定我能帮上忙。我不太记得所有API的工作方式。 - Ilan.b

0

您可能不需要扫描可用的WiFi网络,您可以轻松地按照以下步骤操作:

public static void connectToWifi(Activity activity, String ssid, String password) {
        WifiConfiguration wifiConfig = new WifiConfiguration();

        wifiConfig.SSID = String.format("\"%s\"", ssid);
        wifiConfig.preSharedKey = String.format("\"%s\"", password);

        WifiManager wifiManager = (WifiManager) activity.getSystemService(WIFI_SERVICE);
        wifiManager.setWifiEnabled(true);
        int netId = wifiManager.addNetwork(wifiConfig);
        wifiManager.disconnect();
        wifiManager.enableNetwork(netId, true);
        wifiManager.reconnect();
    }

1
如何判断网络连接成功或失败? - Reid
wifiManager.reconnect(); 将返回一个布尔值,表示您是否已连接。 - Milind Mevada
如果我输入错误的密码,也会返回相同的值... 你能提供解决方案吗? - AngelJanniee

0

只需检查它就像那样

public static boolean isConnectingToInternet(Context context){
  try {
      ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
      if (connectivity != null) {
          NetworkInfo info[] = connectivity.getAllNetworkInfo();
          if (info != null) {
              for (int i = 0; i < info.length; i++)

                  if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                      return true;
                  }

          }
      }
  }catch (Exception e){}
    return false;

} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接