2012-06-18 164 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"); 
      } 
     } 
    } 
};