2009-07-30 75 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秒。