如何检测 android 中无法连接 wifi?

How do I detect fail to connect wifi in android?

检测连接失败的最佳方法是什么?

我知道我们应该使用 NetworkInfo.getState() 来获取连接状态, 我还使用带有 NETWORK_STATE_CHANGED_ACTION 的 BroadcastReceiver 来检测连接状态变化。

我认为在 broadcastReceiver 中检测 DISCONNECTED 状态在这种情况下不匹配。

NetworkInfo.State.DISCONNECTED仅表示"disconnected",并不表示连接失败。

您可以使用这种方式来检测wifi是否连接

public class WifiReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {     
    ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netInfo = conMan.getActiveNetworkInfo();

    if (netInfo != null && netInfo.getType() == ConnectivityManager.TYPE_WIFI) 
        // Connection Successful 
    else
        // Connection  Failed 
  }   
};

WifiManager.SUPPLICANT_STATE_CHANGED_ACTION 注册接收器,以便在发生连接失败时收到通知。可能是因为提供了无效的 Wi-Fi 连接凭据。

private void registerReceiver() {
        IntentFilter filter = new IntentFilter();
        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        filter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
        registerReceiver(mReceiver, filter);
    }

下面是你的接收器

 private BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
        NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
            if (info != null) {
                if (info.isConnected()) {
                    //connected
                    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
                    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
                    String ssid = wifiInfo.getSSID();
                }
            }  else {
                if (intent.getAction().equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) {
                    if (intent.hasExtra(WifiManager.EXTRA_SUPPLICANT_ERROR)) {
                      //failed to connect
                }
            }
        }
    };