2012-06-18 3 views
2

Wi-Fi의 변경 사항을 감지하는 데 문제가 있습니다. Wi-Fi가 연결되어 있지 않으면 내 앱에서 Wi-Fi 네트워크를 모니터링하고 알림 대화 상자를 만들 것을 제안합니다. 시동시, 재개시 등에 또는 b. 언제든지 연결이 끊어집니다. 다음은 내 코드 (내가 this.registerReceiver (wifiStatusReceiver, 신규로 IntentFilter (WifiManager.WIFI_STATE_CHANGED_ACTION))와 onResume에 등록하고있어, 그리고 onPause에서 등록을 해제)입니다 :브로드 캐스트 수신기가 Wi-Fi 연결 끊김을 감지하지 못했습니다.

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

업데이트 :

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

나의 새로운 코드는 다음과 같습니다. 연결이 끊어진 상태, 연결이 끊어져있는 상태, 연결되어있는 상태 등 연결 상태를 확인하기 때문에 SUPPLICANT_STATE_CHANGED_ACTION 만 사용하고 있습니다. 설정에서 Wi-Fi를 사용할 수 있는지 확인하기 때문에 다른 하나는 연결을 모니터링하는 데 꽤 쓸모가 없습니다. 아닙니다. – msnorth

답변

8

업데이트 : 나는 발견했습니다 문제, 그래서 나는 이것에 대해 스스로 대답 할 것이다. 연결이 끊어진 상태, 연결이 끊어져있는 상태, 연결되어있는 상태 등 연결 상태를 확인하기 때문에 SUPPLICANT_STATE_CHANGED_ACTION 만 사용하고 있습니다. 설정에서 Wi-Fi를 사용할 수 있는지 확인하기 때문에 다른 하나는 연결을 모니터링하는 데 꽤 쓸모가 없습니다. 아닙니다.

은 (onResume에서) 내 수신기를 등록 : 내가 문제를 발견했습니다, 그래서 나는이에게 자신을 답변 해 드리겠습니다 :

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"); 
      } 
     } 
    } 
}; 
관련 문제