如何在安卓设备上检测无线网络连接是否建立?

147

我需要检测我是否通过WIFI连接到网络。用于建立有效的网络连接的广播是什么?我需要验证HTTP的有效网络连接是否存在。我应该监听什么,还需要进行哪些额外的测试以确定存在有效的连接。


这个问题的部分已经在这里得到了回答:https://dev59.com/j2855IYBdhLWcg3woVw_ - Androider
1
但是仍然存在一个问题,就是何时检查这些条件? - Androider
1
我想了解一下是否有可能接收到广播接收器可以捕获到的广播? - Androider
1
在Android O上,由于隐式广播接收器(如android.net.wifi.STATE_CHANGE)将不再允许在清单中注册(请参见https://developer.android.com/guide/components/broadcast-exceptions.html),因此我该如何处理呢?如果我们在应用程序活动中注册它(比如onCreate),那么它将必须在onStop()中注销,否则我们将不再接收与wifi相关的事件。 - zafar142003
16个回答

3
这里是我的代码示例,考虑到用户只允许在连接WiFi时进行通信的偏好设置。
我从一个IntentService中调用这段代码,在尝试下载内容之前。
请注意,如果没有任何类型的网络连接,NetworkInfo将为null。
private boolean canConnect()
{
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

    boolean canConnect = false;
    boolean wifiOnly = SharedPreferencesUtils.wifiOnly();

    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    if(networkInfo != null)
    {
        if(networkInfo.isConnected())
        {
            if((networkInfo.getType() == ConnectivityManager.TYPE_WIFI) ||
               (networkInfo.getType() != ConnectivityManager.TYPE_WIFI && !wifiOnly))
            {
                canConnect = true;
            }
        }
    }

    return canConnect;
}

3

我有两种方法来检测应用程序上下文是否接收到WIFI连接:

1)我的旧方法


public boolean isConnectedWifi1(Context context) {
    try {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();           
        if (networkInfo != null) {
            NetworkInfo[] netInfo = connectivityManager.getAllNetworkInfo();
            for (NetworkInfo ni : netInfo) {
                if ((ni.getTypeName().equalsIgnoreCase("WIFI"))
                        && ni.isConnected()) {
                    return true;
                }                   
            }
        }
        return false;
    } catch (Exception e) {
        Log.e(TAG, e.getMessage());
    }
    return false;
}

2) 我的新方法(我目前正在使用这种方法):

public boolean isConnectedWifi(Context context) {
         ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
         NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);     
         return networkInfo.isConnected();
}

在Android O上,由于隐式广播接收器(如android.net.wifi.STATE_CHANGE)将不再允许在清单中注册(请参见https://developer.android.com/guide/components/broadcast-exceptions.html),因此我该如何处理呢?如果我们在应用程序活动中注册它(比如onCreate),那么它将必须在onStop()中注销,否则我们将不再接收与wifi相关的事件。 - zafar142003

2

2
我使用了这段代码:
public class MainActivity extends Activity
    {
    .
    .
    .
    @Override
    protected void onCreate(Bundle savedInstanceState)
        {
        super.onCreate(savedInstanceState);
        .
        .
        .
        }

    @Override
    protected void onResume()
        {
        super.onResume();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
        registerReceiver(broadcastReceiver, intentFilter);  
        }

    @Override
    protected void onPause()
        {
        super.onPause();
        unregisterReceiver(broadcastReceiver);
        }

    private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver()
        {
        @Override
        public void onReceive(Context context, Intent intent)
            {
            final String action = intent.getAction();
            if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION))
                {
                if (intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false))
                    {
                    // wifi is enabled
                    }
                else
                    {
                    // wifi is disabled
                    }
                }
            }
        };
    }

0

你可以使用带有过滤器的广播

 <receiver
        android:name=".receivers.ConnectionType"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
        </intent-filter>
    </receiver>

之后,你可以像这样监听返回的值

  @Override
public void onReceive(Context context, Intent intent) {

    int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN);
    if(wifiState==WifiManager.WIFI_STATE_ENABLED){
        Toast.makeText(context, "WIFI on", Toast.LENGTH_SHORT).show();

    }else if(wifiState==WifiManager.WIFI_STATE_DISABLED) {
        Toast.makeText(context, "WIFI OFF", Toast.LENGTH_SHORT).show();
    }


}

每次WIFI启用或禁用时,它都会触发。


0
Kotlin扩展函数
val Context.isOnline: Boolean
    get() {
        val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager

        if (cm != null) {
            if (Build.VERSION.SDK_INT < 23) {
                val networkInfo = cm.activeNetworkInfo
                if (networkInfo != null) {
                    return networkInfo.isConnected && (networkInfo.type == ConnectivityManager.TYPE_WIFI || networkInfo.type == ConnectivityManager.TYPE_MOBILE ||
                            networkInfo.type == ConnectivityManager.TYPE_VPN || networkInfo.type == ConnectivityManager.TYPE_ETHERNET)
                }
            } else {
                val network = cm.activeNetwork

                if (network != null) {
                    val nc = cm.getNetworkCapabilities(network)
                    return if (nc == null) {
                        false
                    } else {
                        nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) ||
                                nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||
                                nc.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) ||
                                nc.hasTransport(NetworkCapabilities.TRANSPORT_VPN)
                    }
                }
            }
        }
        return false
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接