【问题标题】:Android WiFi connection programmatically以编程方式连接 Android WiFi
【发布时间】:2011-06-29 07:47:03
【问题描述】:

您知道如何在我的 Android 应用程序中通过发送密码建立 wifi 连接吗?

【问题讨论】:

    标签: android connection wifi


    【解决方案1】:

    将 SSID 及其密码传递给以下方法。

    public void connectToAP(String ssid, String passkey) {
        Log.i(TAG, "* connectToAP");
    
        WifiConfiguration wifiConfiguration = new WifiConfiguration();
    
        String networkSSID = ssid;
        String networkPass = passkey;
    
        Log.d(TAG, "# password " + networkPass);
    
        for (ScanResult result : scanResultList) {
            if (result.SSID.equals(networkSSID)) {
    
                String securityMode = getScanResultSecurity(result);
    
                if (securityMode.equalsIgnoreCase("OPEN")) {
    
                    wifiConfiguration.SSID = "\"" + networkSSID + "\"";
                    wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
                    int res = wifiManager.addNetwork(wifiConfiguration);
                    Log.d(TAG, "# add Network returned " + res);
    
                    boolean b = wifiManager.enableNetwork(res, true);
                    Log.d(TAG, "# enableNetwork returned " + b);
    
                    wifiManager.setWifiEnabled(true);
    
                } else if (securityMode.equalsIgnoreCase("WEP")) {
    
                    wifiConfiguration.SSID = "\"" + networkSSID + "\"";
                    wifiConfiguration.wepKeys[0] = "\"" + networkPass + "\"";
                    wifiConfiguration.wepTxKeyIndex = 0;
                    wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
                    wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
                    int res = wifiManager.addNetwork(wifiConfiguration);
                    Log.d(TAG, "### 1 ### add Network returned " + res);
    
                    boolean b = wifiManager.enableNetwork(res, true);
                    Log.d(TAG, "# enableNetwork returned " + b);
    
                    wifiManager.setWifiEnabled(true);
                }
    
                wifiConfiguration.SSID = "\"" + networkSSID + "\"";
                wifiConfiguration.preSharedKey = "\"" + networkPass + "\"";
                wifiConfiguration.hiddenSSID = true;
                wifiConfiguration.status = WifiConfiguration.Status.ENABLED;
                wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
                wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
                wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
                wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
                wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
                wifiConfiguration.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
                wifiConfiguration.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
    
                int res = wifiManager.addNetwork(wifiConfiguration);
                Log.d(TAG, "### 2 ### add Network returned " + res);
    
                wifiManager.enableNetwork(res, true);
    
                boolean changeHappen = wifiManager.saveConfiguration();
    
                if(res != -1 && changeHappen){
                    Log.d(TAG, "### Change happen");
    
                    AppStaticVar.connectedSsidName = networkSSID;
    
                }else{
                    Log.d(TAG, "*** Change NOT happen");
                }
    
                wifiManager.setWifiEnabled(true);
            }
        }
    }
    
    public String getScanResultSecurity(ScanResult scanResult) {
        Log.i(TAG, "* getScanResultSecurity");
    
        final String cap = scanResult.capabilities;
        final String[] securityModes = { "WEP", "PSK", "EAP" };
    
        for (int i = securityModes.length - 1; i >= 0; i--) {
            if (cap.contains(securityModes[i])) {
                return securityModes[i];
            }
        }
    
        return "OPEN";
    }
    

    不要忘记在 Manifest 文件中添加必要的权限。

    【讨论】:

    • 这段代码无法编译,scanResultList和wifiManager这两个变量是在哪里定义的?
    • 您需要获取 WifiManager wifiManager (Context.getSystemService(Context.WIFI_SERVICE)) 并对其进行调用 (wifiMananger.getScanResults()) 以获取 scanResultList 变量。上面的代码假设您已经有一个可用网络列表。
    【解决方案2】:

    100% 有效。

    通过这种方式,您可以连接到您的特定 Wifi MainActivity.java 的这段代码

    //////////// >>> Wifi 连接 (WP2)

            WifiConfiguration wifiConfig = new WifiConfiguration();
    
            wifiConfig.SSID = String.format("\"%s\"", "Wifi name");
            wifiConfig.preSharedKey = String.format("\"%s\"", "Wifi password");
    
            WifiManager wifiManager=(WifiManager)getSystemService(WIFI_SERVICE);
            int netId = wifiManager.addNetwork(wifiConfig);
            wifiManager.disconnect();
            wifiManager.enableNetwork(netId, true);
            wifiManager.reconnect();
    

    并且不要忘记将此代码包含到您的 AndroidManifest.xml 中

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    

    【讨论】:

      【解决方案3】:

      AnujAroshA 这里发布的代码真的很有帮助。但是缺少一个 else 案例:

        ..
        } else if (securityMode.equalsIgnoreCase("PSK")) {
          // PSK code
        ..
      

      否则 PSK 代码也会针对 WEP 和 OPEN 网络执行。

      在我看来,代码风格并不是最佳的。不需要创建两个字符串 networkSSID 和 networkPass。您可以简单地使用 ssid 或密码。

      建议:拆分创建wifi配置和连接方法。

      (1) WifiConfiguration的创建方法:

      private WifiConfiguration createAPConfiguration(String networkSSID, String networkPasskey, String securityMode) {
              WifiConfiguration wifiConfiguration = new WifiConfiguration();
      
              wifiConfiguration.SSID = "\"" + networkSSID + "\"";
      
              if (securityMode.equalsIgnoreCase("OPEN")) {
      
                  wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
      
              } else if (securityMode.equalsIgnoreCase("WEP")) {
      
                  wifiConfiguration.wepKeys[0] = "\"" + networkPasskey + "\"";
                  wifiConfiguration.wepTxKeyIndex = 0;
                  wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
                  wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
      
              } else if (securityMode.equalsIgnoreCase("PSK")) {
      
                  wifiConfiguration.preSharedKey = "\"" + networkPasskey + "\"";
                  wifiConfiguration.hiddenSSID = true;
                  wifiConfiguration.status = WifiConfiguration.Status.ENABLED;
                  wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
                  wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
                  wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
                  wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
                  wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
                  wifiConfiguration.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
                  wifiConfiguration.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
      
              } else {
                  Log.i(TAG, "# Unsupported security mode: "+securityMode);
      
                  return null;
              }
      
              return wifiConfiguration;
      
          }
      

      (2) AP连接方法:

          public int connectToAP(String networkSSID, String networkPasskey) {
          for (ScanResult result : scanResultList) {
      
              if (result.SSID.equals(networkSSID)) {
      
                  String securityMode = getScanResultSecurity(result);
      
                  WifiConfiguration wifiConfiguration = createAPConfiguration(networkSSID, networkPasskey, securityMode);
      
                  int res = wifiManager.addNetwork(wifiConfiguration);
                  Log.d(TAG, "# addNetwork returned " + res);
      
                  boolean b = wifiManager.enableNetwork(res, true);
                  Log.d(TAG, "# enableNetwork returned " + b);
      
                  wifiManager.setWifiEnabled(true);
      
                  boolean changeHappen = wifiManager.saveConfiguration();
      
                  if (res != -1 && changeHappen) {
                      Log.d(TAG, "# Change happen");
                      connectedSsidName = networkSSID;
                  } else {
                      Log.d(TAG, "# Change NOT happen");
                  }
      
                  return res;
              }
          }
      
          return -1;
      }
      

      (3) AnujAroshA 发布的扫描方法 100%。

      public String getScanResultSecurity(ScanResult scanResult) {
      
          final String cap = scanResult.capabilities;
          final String[] securityModes = { "WEP", "PSK", "EAP" };
      
          for (int i = securityModes.length - 1; i >= 0; i--) {
              if (cap.contains(securityModes[i])) {
                  return securityModes[i];
              }
          }
      
          return "OPEN";
      }
      

      【讨论】:

        【解决方案4】:

        提供你的 ssid 和密码

            fun connectToWifi(ssid: String, password: String) {
            val connManager = context!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
            val networkInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
            val wifiConfiguration = WifiConfiguration()
            wifiConfiguration.SSID = String.format("\"%s\"", ssid)
            wifiConfiguration.preSharedKey = String.format("\"%s\"", password)
            wifiManager = context!!.getSystemService(Context.WIFI_SERVICE) as WifiManager
            val netId: Int = wifiManager.addNetwork(wifiConfiguration)
            wifiManager.disconnect()
            wifiManager.enableNetwork(netId, true)
            wifiManager.reconnect()
            val config = WifiConfiguration()
            config.SSID == "\"\"" + ssid + "\"\""
            config.preSharedKey == "\"\"" + password + "\"\""
            wifiManager.addNetwork(config)
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-25
          • 1970-01-01
          • 2020-07-23
          • 1970-01-01
          • 2019-01-15
          • 2018-08-18
          • 2023-01-27
          • 1970-01-01
          相关资源
          最近更新 更多