2012-04-26 147 views
3

我已按照following link与本地wifi连接。它工作完美。我能够连接到我的本地WiFi。检索WiFi连接状态(Android)

但是,我真的想要wifi的当前状态,我使用下面的代码来获取wifi的状态。但不幸的是,我只能得到'DISABLED','ENABLED'和'SCANNING'的状态,我真的想要接受其他中间状态。

你能告诉我我做错了什么吗?

public class ConnectionChangeReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 

     NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); 
     Message msg = new Message(); 
     msg.what = 5; 
     Bundle b = new Bundle(); 
     String sStatus = "UnKnown"; 
     switch(info.getDetailedState()){ 
     case AUTHENTICATING: 
      sStatus = "Authenticating..."; 
      break; 
     case CONNECTED: 
      sStatus = "Connected"; 
      break; 
     case CONNECTING: 
      sStatus = "Connecting..."; 
      break; 
     case DISCONNECTED: 
      sStatus = "Disconnected"; 
      break; 
     case DISCONNECTING: 
      sStatus = "Disconnecting..."; 
      break; 
     case FAILED: 
      sStatus = "Failed"; 
      break; 
     case IDLE: 
      sStatus = "Idle"; 
      break; 
     case OBTAINING_IPADDR : 
      sStatus = "Obtaining IP Address..."; 
      break; 
     case SCANNING: 
      sStatus = "Scanning..."; 
      break; 
     case SUSPENDED: 
      sStatus = "Suspended"; 
      break; 
     } 
     b.putString("status", sStatus); 
     msg.setData(b); 
     mHandler.sendMessage(msg); 
    } 
} 

我注册的广播接收机按以下方式

IntentFilter filter = new IntentFilter(
     ConnectivityManager.CONNECTIVITY_ACTION); 
    registerReceiver(networkStateReceiver, filter); 
+0

这可能是其他的可能性永远不会被你的设备上执行报告 - 它可能不会理会报告具有这种粒度。我认为你从来没有看到你在那里默认的“未知”? – 2012-04-26 06:29:44

回答

15

注册::

mIntentFilter = new IntentFilter(); 
    mIntentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); 
    mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 
    mIntentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); 
    mIntentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION); 
    registerReceiver(mReceiver, mIntentFilter); 




public void onReceive(Context context, Intent intent) 
    { 
    String action = intent.getAction(); 
    if(action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) 
    { 
    }else if(action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) 
    { 
    int iTemp = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 
     WifiManager.WIFI_STATE_UNKNOWN); 
    LogUtil.d(LOG_SET, "+++++++-----------wifiStateReceiver------+++++++", DEBUG); 
    checkState(iTemp); 
    }else if(action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) 
    { 
    DetailedState state =WifiInfo.getDetailedStateOf((SupplicantState) 
    intent.getParcelableExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED)); 
    changeState(state); 
    LogUtil.d(LOG_SET, "------------>>>>SUPPLICANT_STATE_CHANGED_ACTION<<<<<<-------", DEBUG); 
    } 
    else if(action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) 
    { 
     DetailedState state= 
     ((NetworkInfo)intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO)).getDetailedState(); 
     changeState(state); 
    } 
    } 
    private void changeState(DetailedState aState) 
    { 
    LogUtil.d(LOG_SET, ">>>>>>>>>>>>>>>>>>changeState<<<<<<<<<<<<<<<<"+aState, DEBUG); 
    if (aState == DetailedState.SCANNING) 
    { 
    Log.d("wifiSupplicanState", "SCANNING"); 
    } 
    else if (aState == DetailedState.CONNECTING) 
    { 
    Log.d("wifiSupplicanState", "CONNECTING"); 
    }else if(aState == DetailedState.OBTAINING_IPADDR) 
    { 
    Log.d("wifiSupplicanState", "OBTAINING_IPADDR"); 
    } 
    else if (aState == DetailedState.CONNECTED) 
    { 
    Log.d("wifiSupplicanState", "CONNECTED"); 
    } 
    else if (aState == DetailedState.DISCONNECTING) 
    { 
    Log.d("wifiSupplicanState", "DISCONNECTING"); 
    } 
    else if (aState == DetailedState.DISCONNECTED) 
    { 
    Log.d("wifiSupplicanState", "DISCONNECTTED"); 
    } 
    else if (aState == DetailedState.FAILED) 
    { 
    } 
    } 

    public void checkState(int aInt) 
    { 
    LogUtil.d(LOG_SET,"==>>>>>>>>checkState<<<<<<<<"+aInt, DEBUG); 
    if (aInt == WifiManager.WIFI_STATE_ENABLING) 
    { 
    Log.d("WifiManager", "WIFI_STATE_ENABLING"); 
    } 
    else if (aInt== WifiManager.WIFI_STATE_ENABLED) 
    { 
    Log.d("WifiManager", "WIFI_STATE_ENABLED"); 
    } 
    else if (aInt == WifiManager.WIFI_STATE_DISABLING) 
    { 
    Log.d("WifiManager", "WIFI_STATE_DISABLING"); 
    } 
    else if (aInt == WifiManager.WIFI_STATE_DISABLED) 
    { 
    Log.d("WifiManager", "WIFI_STATE_DISABLED"); 
    } 
    } 
+0

我无法注册registerReceiver(mReceiver,mIntentFilter); 。我应该包含一些额外的清单权限。 – 2012-04-26 07:36:09

+0

注册时发生了什么 – 2012-04-26 10:39:04

+0

未提供WifiManager.NETWORK_STATE_CHANGED_ACTION请求者状态。如果您希望请求方状态,则为WifiManager.SUPPLICANT_STATE_CHANGED_ACTION添加意向过滤器 – 2017-05-19 17:32:04

2

而不是使用

NetworkInfo info = intent.getParcelableExtra(ConnectivityManager 
                  .EXTRA_NETWORK_INFO); 

尝试使用

int extraWifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE , 
    WifiManager.WIFI_STATE_UNKNOWN); 

Follow this Blog

+0

感谢您的链接和答案。但我无法检索其他状态,如“获取IP地址”。但对于“启用”,“扫描”和“禁用”(+ 1)非常有用。 – 2012-04-26 14:28:01

1

一个reciver此代码:

IntentFilter mIntentFilter = new IntentFilter(); 
mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); 
registerReceiver(receiverWifi, mIntentFilter); 


class WifiReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context c, Intent intent) { 
     String action = intent.getAction(); 
     if(action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)){ 
      Log.d("WifiReceiver", ">>>>SUPPLICANT_STATE_CHANGED_ACTION<<<<<<"); 
      SupplicantState supl_state=((SupplicantState)intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE)); 
      switch(supl_state){ 
      case ASSOCIATED:Log.i("SupplicantState", "ASSOCIATED"); 
       break; 
      case ASSOCIATING:Log.i("SupplicantState", "ASSOCIATING"); 
       break; 
      case AUTHENTICATING:Log.i("SupplicantState", "Authenticating..."); 
       break; 
      case COMPLETED:Log.i("SupplicantState", "Connected"); 
       break; 
      case DISCONNECTED:Log.i("SupplicantState", "Disconnected"); 
       break; 
      case DORMANT:Log.i("SupplicantState", "DORMANT"); 
       break; 
      case FOUR_WAY_HANDSHAKE:Log.i("SupplicantState", "FOUR_WAY_HANDSHAKE"); 
       break; 
      case GROUP_HANDSHAKE:Log.i("SupplicantState", "GROUP_HANDSHAKE"); 
       break; 
      case INACTIVE:Log.i("SupplicantState", "INACTIVE"); 
       break; 
      case INTERFACE_DISABLED:Log.i("SupplicantState", "INTERFACE_DISABLED"); 
       break; 
      case INVALID:Log.i("SupplicantState", "INVALID"); 
       break; 
      case SCANNING:Log.i("SupplicantState", "SCANNING"); 
       break; 
      case UNINITIALIZED:Log.i("SupplicantState", "UNINITIALIZED"); 
       break; 
      default:Log.i("SupplicantState", "Unknown"); 
       break; 

      } 
      int supl_error=intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, -1); 
      if(supl_error==WifiManager.ERROR_AUTHENTICATING){ 
       Log.i("ERROR_AUTHENTICATING", "ERROR_AUTHENTICATING!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); 
      } 
     } 
    } 
} 

<receiver 
    android:name=".MyActivity$WifiReceiver" 
    android:process=":remote" > 
</receiver>