【问题标题】:Android Scan for Wifi networksAndroid 扫描 Wifi 网络
【发布时间】:2011-02-28 05:35:38
【问题描述】:

我正在尝试扫描无线网络,并在网上找到了这个有用的资源。 不幸的是,它不起作用,我不知道为什么。我的问题是我不能等待 10 分钟的结果 - 我需要它们在几秒钟内,并考虑在我得到结果后立即将布尔变量设置为 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 上测试过吗?

标签: android wifi android-wifi


【解决方案1】:

嗯,我对加快进程一无所知,可能只是需要一段时间才能找到 wifi 信号(或者你的 wifi 没有打开......这是你的程序应该检查的东西在它开始之前)。但是,您可以做的一件事来改进您的工作流程,那就是使用 startActivityForResult() 在不同的活动中完成所有这些工作。这样,您的“主要”活动将能够在完成后对该数据采取行动,而您不必在 while 循环中消耗 CPU。

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

【讨论】:

    【解决方案2】:

    你把这段代码放在哪里?在某个活动的onCreate 中?

    问题是您正在注册一个回调,当您收到扫描结果时会调用该回调,according to the Android API docs 是在单独的线程中完成的,因此在这种情况下,您的忙等待循环除了不必要地停止之外没有任何作用您的活动,如果它在 onCreate 期间,则意味着它永远不会退出该方法。

    【讨论】:

    • 是的,它在 onCreate 方法中...我现在将其移至 OnStart,但它仍然无法正常工作...似乎从未调用过 onReceive 函数...可能在某个地方错误 ?我运行良好,但它永远不会退出这个循环......
    • 你不会想把它放在任何 onCreate、onRestart、onStart 方法中,因为它们都会带来同样的问题:你永远不会退出这些方法,因此回调永远不会发生。
    【解决方案3】:

    好的,我发现了错误。

    这是循环。看起来 onReceive 函数从未被调用,因为活动仅运行此循环。看起来程序必须到达函数的末尾才能执行其他函数,如 OnReceive ...

    感谢您的帮助。它帮助我改进了一点:)

    【讨论】:

      【解决方案4】:

      您需要实现一个 BroadcastReceiver 来监听从WifiManager.startScan(). onReceive() 返回的扫描结果,这样您就可以直接访问扫描结果。 扫描完成并触发onReceive()...

      大约需要 1 秒

      【讨论】:

      • 这是正确的答案。这是 android 的方式,让您几乎可以立即获得新数据。
      【解决方案5】:

      你应该这样写BroadcastReceiver

      1. 注册
      2. 然后 startScan 并这样做

        if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action)) {
        
        super.onReceive(context, intent);           
        //Scan is ok, just need few seconds!
        }
        

      【讨论】: