2009-07-30 102 views
11

我会在信号强度发生变化时收到通知。我试图创建下面的方法,并调用它在OnCreate():Android:如何监控WiFi信号强度

private void initializeWiFiListener(){ 
    Log.i(TAG, "executing initializeWiFiListener"); 

    String connectivity_context = Context.WIFI_SERVICE; 
    final WifiManager wifi = (WifiManager)getSystemService(connectivity_context); 

    if(!wifi.isWifiEnabled()){ 
     if(wifi.getWifiState() != WifiManager.WIFI_STATE_ENABLING){ 
      wifi.setWifiEnabled(true); 
     } 
    } 

    registerReceiver(new BroadcastReceiver(){ 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      WifiInfo info = wifi.getConnectionInfo(); 
      //TODO: implement methods for action handling 
     } 

    }, new IntentFilter(WifiManager.RSSI_CHANGED_ACTION)); 
} 

我希望如果如果方法正确写入任何人都可以查询。我试图运行应用程序,但没有收到任何通知,也不确定它是否是因为信号强度可能在我运行调试的地方不变,或者是因为缺少某些东西。

谢谢!

回答

12

首先,请确保您的清单文件中有<uses-permission>,ACCESS_WIFI_STATE。当我收到成功

wifi.startScan(); 

下,:

其次,我不知道有关通知对于单个的连接,但得到的一切无线电是看到通知,你就可以开始扫描结果,我在IntentFilter中使用WifiManager.SCAN_RESULTS_AVAILABLE_ACTION

然后,在接收器中,我使用WifiManager对象中的getScanResults(),它还包含信号强度。

对于以这种方式停止,您只需致电unregisterRecever()(因此您需要保留它以便引用)。我还没有测试自己,看看我的扫描代码是否可以修改为只检查当前连接,但我知道我得到了很多结果 - Wi-Fi信号频繁且快速地变化。我想为了监控一个连接,你也可以过滤扫描结果并寻找设备当前连接的那个。

我希望这会有所帮助。

+2

你可以开发你的答案咯? – Vervatovskis 2012-04-17 11:07:25

0

就砸我的解决方案:

在我的应用我有

@Override 
protected void onResume() { 
    super.onResume(); 
    networkStateReceiver = new NetworkStateReceiver(this); 
    this.registerReceiver(networkStateReceiver, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE")); 
    this.registerReceiver(networkStateReceiver, new IntentFilter("android.net.wifi.SCAN_RESULTS")); 
    networkStateReceiver.registerListener(this); 
} 

而且的onReceive在我的接收器看起来像:

@Override 
public void onReceive(Context context, Intent intent) { 
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); 
    if (networkInfo != null && networkInfo.isConnectedOrConnecting()) { 
     switch (networkInfo.getType()) { 
      case ConnectivityManager.TYPE_ETHERNET: 
       this.networkStateMessage = new NetworkStateMessage(networkInfo); 
       break; 
      case ConnectivityManager.TYPE_WIFI: 
       this.networkStateMessage = new NetworkStateMessage(networkInfo, wifiManager.getConnectionInfo()); 
       worker.schedule(new Runnable() { 
        @Override 
        public void run() { wifiManager.startScan(); } 
       }, 5, TimeUnit.SECONDS); 
       break; 
      default: 
       this.networkStateMessage = null; 
       break; 
     } 
    } 
    notifyStateToAll(this.networkStateMessage); 
} 

的想法是,以startScan()只有每如果wifi是活动网络,则为5秒。