2013-03-06 131 views
3

我想以编程方式连接到WiFi网络。Android - 以编程方式连接到wifi

这里是我的代码:

wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); 
wifiManager.setWifiEnabled(true); 

WifiConfiguration config = new WifiConfiguration(); 
config.SSID = "\"" + ssid + "\""; 
config.preSharedKey = "\""+ key +"\""; 

int netId = wifiManager.addNetwork(config); 
wifiManager.saveConfiguration(); 
wifiManager.disconnect(); 
wifiManager.enableNetwork(netId, true); 
wifiManager.reconnect(); 

当我有我的手机支持WiFi,它工作正常,但问题是,当无线网络被禁用。在这种情况下,唯一的结果是启用WiFi适配器,但不能连接到网络。它似乎启用需要很长时间,所以它不会连接。另一个奇怪的事情是wifiManager.getConfiguredNetworks()返回null。你知道如何解决这个问题吗?

谢谢

+0

我还发现,在可变的NetID为-1,所以加入网络失败,我不知道为什么。 – 2013-03-06 20:24:46

+0

请看看这个http://stackoverflow.com/questions/4374862/how-to-programatically-create-and-read-wep-eap-wifi-configurations-in-android/4374934#4374934.I认为这可能做你的工作。 – 2013-12-23 08:09:37

+0

嘿,...我也是@TomášČerný,...所以如何解决它? – gumuruh 2014-07-26 10:09:51

回答

4

好像使需要长期所以它不会连接。

是的。这是因为网络的启用是异步完成的,它并行发生,并且不会立即发生。这里有两个可能的解决方案来解决你的问题:

1)这是最简单的解决方案,但不是最好的。循环,如其他用户所描述的那样检查扫描结果是否进入。但是,您应该在循环的每个循环之间添加某种睡眠。 I.E.你想等待1ms,以免吃掉所有的CPU资源。我不知道如何在Android上做到这一点。这种方法还有另一个问题。如果你在GUI线程中,当你等待连接建立时,你将以这种方式阻止所有的GUI事件。

2)这是正确的解决方案。网络连接建立后,您可以注册广播事件。然后当它结束时你会得到一个事件。从这个事件中,你可以完成任何需要的操作。

对不起,赶紧回答。我不是Android专业人士,所以我不能解释如何从头顶上做这件事的细节,但我认为我会至少指出你在正确的方向。

+0

他已经完成了他的问题@ user2108746? – gumuruh 2014-07-21 08:18:00

-1

实际上,如果您连接WiFi不止一次,它将解决您的问题。

我看到的另一件事是,如果我的WiFi已启用,并且连接到特定的WiFi网络,那么它正在工作。

另外一件事,当我从移动网络切换到特定的WiFi网络,然后它给出了一个不稳定的连接..对于这个问题,我通过一个特定的WiFi网络连接WiFi,然后在3秒延迟后再次忘记网络我再次连接。然后它正常工作。

我使用此代码连接到WiFi。

而对于延迟和有WiFi网络我使用此代码... .......

{ 
    wifi(SSID,PASS); 
    final Handler handler = new Handler(); 
    handler.postDelayed( 
     new Runnable() 
     { 
      Override public void run() { forgot(); } 
     }, 3000); 
    final Handler handler1 = new Handler(); 
    handler1.postDelayed(
     new Runnable() 
     { 
      Override public void run() {wifi(SSID,PASS); } 
     }, 3000); 
} 
+0

....... 和延迟和获得WiFi网络我使用此代码... .......{SSID,PASS}; {0} {0} {0} {0} final Handler handler = new Handler(); handler.postDelayed(新的Runnable(){ 覆盖 公共无效的run(){ 忘记();} } ,3000); Final Handler handler1 = new Handler(); handler1.postDelayed(new Runnable(){ 覆盖public void run(){wifi(SSID,PASS);}},3000);} – user7212280 2016-11-26 06:25:59

+0

欢迎来到Stack Overflow!我编辑了你的问题。在此处发布代码时,请将其缩进4个空格,以便在'code markdown'中获取。 – 2016-11-26 07:58:56

相关问题