安卓扫描Wifi网络

4

我正在尝试扫描无线网络,并在网上找到了这个有用的资源。不幸的是它并没有起作用,我不知道为什么。我的问题是我不能等待10分钟来获取结果 - 我需要在几秒钟内得到它们,并考虑设置布尔变量waiting为false,一旦我得到结果...好吧,它永远运行下去...看起来没有接收到任何东西。有什么想法吗?谢谢。

// -- Sample WiFi implementation - http://groups.google.com/group/android-developers/browse_thread/thread/f722d5f90cfae69
        IntentFilter i = new IntentFilter();
        i.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
            registerReceiver(new BroadcastReceiver(){
                @Override
                public void onReceive(Context c, Intent i){
                    // Code to execute when SCAN_RESULTS_AVAILABLE_ACTION event occurs
                    mWifiManager = (WifiManager) c.getSystemService(Context.WIFI_SERVICE);
                    wireless =  mWifiManager.getScanResults(); // Returns a <list> of scanResults
                    waiting = false;
                }
            }
        ,i);
        // -- End Wifi Sample 


        mWifiManager.startScan();


        while (waiting)  { 
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Log.d("PROJECT1","Wifi WAITING");
        }

好的,很不错的尝试。@Nils 你是在真机上测试过吗还是在模拟器上? - gumuruh
5个回答

9

您需要实现一个BroadcastReceiver来监听从WifiManager.startScan()返回的扫描结果。 onReceive()允许您直接访问扫描结果。 扫描大约需要1秒钟才能完成并触发onReceive()...


1
这是正确的答案。这是 Android 的方式,可以让您几乎立即获取新鲜数据。 - Eagle

3
你把这段代码放在哪里?是在一个activity的onCreate方法中吗?
问题在于,你正在注册一个回调函数,该函数会在接收到扫描结果时被调用。根据Android API文档所述,扫描结果是在单独的线程中完成的,因此在此情况下,你的忙等待循环除了无谓地停止你的活动之外,什么也没有实现。如果它在onCreate期间发生,那么意味着它永远不会退出该方法。

是的,它在onCreate方法中...我现在将其移动到OnStart,但仍然不起作用...似乎onReceive函数从未被调用...也许有错误吗?它运行良好,但它永远不会退出这个循环... - Nils
2
你不会想把它放在任何一个onCreate、onRestart、onStart方法中,因为它们都存在同样的问题:你永远不会退出这些方法,因此回调函数将永远不会发生。 - mtmurdock

2

我并不了解如何加快这个过程,可能是需要一段时间才能找到WiFi信号(或者您的WiFi没有开启...这是您的程序在启动之前应该检查的内容)。不过,您可以通过使用startActivityForResult()在不同的活动中完成所有这些操作,从而提高工作效率。这样,在数据完成后,“主”活动就能够对其进行处理,而无需在while循环中占用CPU。

public void onActivityResult(....){
   switch(retCode){
   case SCAN_ACTIVITY:{
         //do stuff
      }
   }
}

2

好的,我找到了错误。

是循环的问题。看起来只有当活动运行此循环时,onReceive函数才不会被调用。似乎程序必须达到函数的末尾才能执行其他函数,如OnReceive ...

无论如何,感谢您的帮助。它帮助我稍微改进了一下 :)


0

你应该像这样在 BroadcastReceiver 中编写:

  1. 注册它
  2. 然后开始扫描并操作如下:

    if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action)) {
    
    super.onReceive(context, intent);           
    //扫描完成,只需要几秒钟!
    }
    

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