2012-06-18 122 views
2

我在檢測wifi的改變時遇到了一些麻煩。我希望我的應用程序能夠監視無線網絡,並在無線網絡斷開時創建一個警告對話框。在啓動,恢復等時或b。任何時候連接丟失。 這裏是我的代碼(我與this.registerReceiver(wifiStatusReceiver,新的IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION))註冊它的onResume;而在註銷的onPause它):廣播接收機沒有檢測到wifi連接丟失

BroadcastReceiver wifiStatusReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     int extraWifiState = intent.getIntExtra(
       WifiManager.EXTRA_WIFI_STATE, 
       WifiManager.WIFI_STATE_UNKNOWN); 

     final String action = intent.getAction(); 

     DialogFragment dialog = (DialogFragment) fragmentManager 
       .findFragmentByTag(WifiAlertDialogFragment.DIALOG_WIFI); 

     if (action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) { 
      NetworkInfo info = (NetworkInfo) intent 
        .getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); 
      if (info.getState().equals(NetworkInfo.State.CONNECTED)) { 
       logger.d("wifi changed, is still connected"); 
       if (dialog != null) 
        dialog.dismiss(); 
      } else { 
       logger.d("connection lost"); 
       if (dialog == null) 
        WifiAlertDialogFragment.wifiCheck(HomeActivity.this); 
      } 
     } 

     switch (extraWifiState) { 

     case WifiManager.WIFI_STATE_DISABLED: 
      WifiAlertDialogFragment.wifiCheck(HomeActivity.this); 
      break; 
     case WifiManager.WIFI_STATE_DISABLING: 
      Toast.makeText(HomeActivity.this, R.string.wifi_disabled, 
        Toast.LENGTH_SHORT).show(); 
      WifiAlertDialogFragment.wifiCheck(HomeActivity.this); 
      break; 
     case WifiManager.WIFI_STATE_ENABLED: 
      if (dialog != null) 
       dialog.dismiss(); 
      break; 
     case WifiManager.WIFI_STATE_ENABLING: 
      if (dialog != null) 
       dialog.dismiss(); 
      Toast.makeText(HomeActivity.this, "Wifi Enabling", 
        Toast.LENGTH_LONG).show(); 
      break; 
     case WifiManager.WIFI_STATE_UNKNOWN: 
      // no op 
      break; 
     } 
    } 
}; 
+0

更新:我已經發現了問題,所以我會回答這個自己。我正在使用SUPPLICANT_STATE_CHANGED_ACTION,因爲它正在檢查任何wifi狀態 - 斷開連接,禁用,連接,啓用等。另一個對於監視連接來說很沒用,因爲它只檢查用戶是否在設置中啓用了WiFi或不。 – msnorth

回答

8

更新:我已經找到了問題,所以我會自己回答。我正在使用SUPPLICANT_STATE_CHANGED_ACTION,因爲它正在檢查任何wifi狀態 - 斷開連接,禁用,連接,啓用等。另一個對於監視連接來說很沒用,因爲它只檢查用戶是否在設置中啓用了WiFi或不。

註冊我的接收器(在的onResume):

IntentFilter filter = new IntentFilter(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); 
    this.registerReceiver(wifiStatusReceiver, filter); 

我的新代碼如下所示:

BroadcastReceiver wifiStatusReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     logger.d("checking wifi state..."); 
     SupplicantState supState; 
     WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
     WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
     supState = wifiInfo.getSupplicantState(); 
     logger.d("supplicant state: " + supState); 

     SherlockDialogFragment dialog = (SherlockDialogFragment) fragmentManager 
       .findFragmentByTag(WifiAlertDialogFragment.DIALOG_WIFI); 

     if (supState.equals(SupplicantState.COMPLETED)) { 
      logger.d("wifi enabled and connected"); 
      if (dialog != null) 
       dialog.dismiss(); 
     } else { 
      WifiAlertDialogFragment.wifiCheck(HomeActivity.this); 
      if (supState.equals(SupplicantState.SCANNING)) { 
       logger.d("wifi scanning"); 
      } else if (supState.equals(SupplicantState.DISCONNECTED)) { 
       logger.d("wifi disonnected"); 
      } else { 
       Toast.makeText(HomeActivity.this, "Wifi Enabling", 
         Toast.LENGTH_LONG).show(); 
       logger.d("wifi connecting"); 
      } 
     } 
    } 
};