当前位置:首页 > 行业动态 > 正文

安卓判断网络是否连接

Android中可通过ConnectivityManager获取NetworkInfo对象,调用其isConnected()方法判断当前网络是否已

判断网络连接状态的方法

使用 ConnectivityManager 检测网络状态

  • 核心类ConnectivityManager(系统服务)
  • 关键方法getActiveNetworkInfo()(已弃用,但仍兼容低版本)或 getNetworkCapabilities()(API 23+)
  • 权限ACCESS_NETWORK_STATE(无需动态申请)

判断网络是否可用

// 获取 ConnectivityManager
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
// 方法1:通过 getActiveNetworkInfo(适用于 API < 23)
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
boolean isConnected = networkInfo != null && networkInfo.isConnected();
// 方法2:通过 getNetworkCapabilities(适用于 API >= 23)
NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork());
boolean isConnected = capabilities != null && 
                      capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || 
                      capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) ||
                      capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET);

判断网络类型(Wifi/移动数据/其他)

网络类型 判断条件(旧方法) 判断条件(新方法)
Wifi networkInfo.getType() == ConnectivityManager.TYPE_WIFI capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
移动数据 networkInfo.getType() == ConnectivityManager.TYPE_MOBILE capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
有线网络 无直接判断(需自定义) capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)
无网络 networkInfo == null || !networkInfo.isConnected() capabilities == null

动态权限处理(仅针对网络状态检测)

  • 权限声明<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  • 注意:此权限为普通权限,无需动态申请(与 ACCESS_FINE_LOCATION 不同)。

代码示例(兼容不同 API 版本)

public boolean isNetworkAvailable(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (cm == null) return false;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23+
        NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork());
        return capabilities != null && 
               (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||
                capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) ||
                capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET));
    } else { // API < 23
        NetworkInfo networkInfo = cm.getActiveNetworkInfo();
        return networkInfo != null && networkInfo.isConnected();
    }
}

相关问题与解答

问题1:如何判断当前是否仅连接 Wifi(排除移动数据)?

解答
在旧方法中,检查 networkInfo.getType() == ConnectivityManager.TYPE_WIFI
在新方法中,检查 capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) 且其他传输类型(如蜂窝网络)不存在。
示例代码

boolean isWifi = false;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork());
    isWifi = capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) &&
             !capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
} else {
    NetworkInfo networkInfo = cm.getActiveNetworkInfo();
    isWifi = networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI;
}

问题2:如何监听网络状态变化?

解答
通过注册 BroadcastReceiver 监听 android.net.conn.CONNECTIVITY_CHANGE 广播。
示例代码

// 定义 BroadcastReceiver
private BroadcastReceiver networkReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        boolean isConnected = isNetworkAvailable(context); // 复用上述方法
        // 根据状态更新 UI 或逻辑
    }
};
// 注册与注销(建议在 Activity 或 Service 中操作)
@Override
protected void onStart() {
    super.onStart();
    IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
    registerReceiver(networkReceiver, filter);
}
@Override
protected void onStop() {
    super.onStop();
    unregisterReceiver(networkReceiver);
}
0