【问题标题】:Can't connect to WiFi network无法连接到 WiFi 网络
【发布时间】:2015-05-20 23:16:10
【问题描述】:

我是 android 开发新手,正在尝试使用 Android SDK 连接到 WiFi 网络。断开连接的代码工作正常,但重新连接失败。这是我的代码

try {
        WifiConfiguration conf = new WifiConfiguration();
        conf.SSID = "\"" + networkSSID + "\"";   // Please note the quotes. String should contain SSID in quotes
        conf.wepKeys[0] = password;  //WEP password is in hex, we do not need to surround it with quotes.
        conf.wepTxKeyIndex = 0;
        conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
        conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); 

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

        List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
        for( WifiConfiguration i : list ) {
            if(i.SSID != null && i.SSID.equals("\"" + networkSSID + "\"")) {
                 wifiManager.disconnect();
                 wifiManager.enableNetwork(i.networkId, true);
                 wifiManager.reconnect();               

                 break;
            }           
         }

        //WiFi Connection success, return true
        return true;
    } catch (Exception ex) {

        throw ex;
    }

我将此代码包装在我在不同应用程序中使用的 jar 文件中。当我调用此方法并尝试使用 SSID 和密码连接到 WEP 网络时,我不断收到以下错误:

android.system.ErrNoException: recvfrom failed: ETIMEDOUT(连接超时)。

该错误确实表明某处存在连接超时,但我无法解决这个问题来修复我的代码。我可以在代码中引入任何指针和更改以使其工作吗??

帕里托什

【问题讨论】:

  • 我不清楚你是在什么时候收到错误的。如果要连接,为什么要断开连接?
  • 我基本上使用列表视图列出了所有可用的网络,用户可以从列表中选择一个并输入密码以连接到新网络。因此与现有网络断开连接并与新网络连接。
  • It is unclear to me at which moment you get the error.
  • 如果您只是使用此代码而不是来自 jar 文件,那么它的行为如何?
  • 您确定此 SSID 使用 WEP 编码吗?

标签: android android-wifi wifimanager


【解决方案1】:

连接信息可以异步到达,因此您无法在您提到的代码中知道连接是否成功。您可以尝试实现一个广播接收器,它获取 wifi 连接的信息。

public class ConnectivityChangedReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        ConnectivityManager conMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo[] netInf = conMgr.getAllNetworkInfo();

        for (NetworkInfo inf : netInf) {
            if (inf.getTypeName().contains("wifi")) {
                if (inf.isConnected()) {
                    Toast.makeText(context, "Connected to Wifi", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(context, "Could not connect to wifi", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }
}

然后,在您的 android 清单中,您应该将其声明为接收器,如下所示:

<receiver android:name=".YourPackageName.ConnectivityChangedReceiver" >
    <intent-filter>
        <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
        <action android:name="android.net.wifi.STATE_CHANGE" />
        </intent-filter>
</receiver>

我现在只是自己尝试,但我认为这是解决此问题的正确解决方法,因为 Wifimanager.reconnect() 并没有真正将我连接到配置的网络。祝你好运。

【讨论】:

  • 我确实尝试了您的建议,但这只会改进代码,它仍然无法回答为什么我无法连接到新网络(除非它存储在 Android wifi 连接列表中)。尝试忘记现有的连接并从应用内连接,它不会连接。
  • 我有一个类似的连接到 wifi 的应用程序,但我的代码和你的代码之间唯一不同的是这一行:conf.wepKeys[0] = password;我也把密码放在括号里。其余的,它是相同的代码。此外,您可以尝试遍历已配置的网络,以查看您尝试添加的网络是否已存在,如果存在,请通过 wifiManager.updateNetork(config) 对其进行更新。
猜你喜欢
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多