详细介绍:Android 网络 - NetworkCapabilities(NetworkCapabilities 概述、传输类型、网络能力、实例实操)

一、NetworkCapabilities 概述

  1. NetworkCapabilities 包含有关网络属性的信息,例如传输类型(Wi-Fi、移动网络、蓝牙等)以及网络能力

  2. 可以通过 NetworkCapabilities,确认网络是否能够发送彩信、是否通过强制门户接入、是否按流量计费等


二、NetworkCapabilities 传输类型

public static final int TRANSPORT_BLUETOOTH = 2;
public static final int TRANSPORT_CELLULAR = 0;
public static final int TRANSPORT_ETHERNET = 3;
public static final int TRANSPORT_LOWPAN = 6;
public static final int TRANSPORT_THREAD = 9;
public static final int TRANSPORT_USB = 8;
public static final int TRANSPORT_VPN = 4;
public static final int TRANSPORT_WIFI = 1;
public static final int TRANSPORT_WIFI_AWARE = 5;
  1. 主要传输类型
传输类型说明
TRANSPORT_CELLULAR蜂窝移动网络(2G / 3G / 4G / 5G)
TRANSPORT_WIFIWi-Fi 无线网络
TRANSPORT_BLUETOOTH蓝牙网络
TRANSPORT_ETHERNET有线以太网
TRANSPORT_VPNVPN 虚拟专用网络
  1. 特殊用途传输类型
传输类型说明
TRANSPORT_WIFI_AWAREWi-Fi Aware(邻近感知网络)
TRANSPORT_LOWPAN低功耗无线个域网(IoT 设备)
TRANSPORT_USBUSB 网络共享
TRANSPORT_THREADThread 协议(物联网 Mesh 网络)

三、NetworkCapabilities 网络能力

public static final int NET_CAPABILITY_CAPTIVE_PORTAL = 17;
public static final int NET_CAPABILITY_CBS = 5;
public static final int NET_CAPABILITY_DUN = 2;
public static final int NET_CAPABILITY_EIMS = 10;
public static final int NET_CAPABILITY_ENTERPRISE = 29;
public static final int NET_CAPABILITY_FOREGROUND = 19;
public static final int NET_CAPABILITY_FOTA = 3;
public static final int NET_CAPABILITY_HEAD_UNIT = 32;
public static final int NET_CAPABILITY_IA = 7;
public static final int NET_CAPABILITY_IMS = 4;
public static final int NET_CAPABILITY_INTERNET = 12;
public static final int NET_CAPABILITY_MCX = 23;
public static final int NET_CAPABILITY_MMS = 0;
public static final int NET_CAPABILITY_MMTEL = 33;
public static final int NET_CAPABILITY_NOT_CONGESTED = 20;
public static final int NET_CAPABILITY_NOT_METERED = 11;
public static final int NET_CAPABILITY_NOT_RESTRICTED = 13;
public static final int NET_CAPABILITY_NOT_ROAMING = 18;
public static final int NET_CAPABILITY_NOT_SUSPENDED = 21;
public static final int NET_CAPABILITY_NOT_VPN = 15;
public static final int NET_CAPABILITY_PRIORITIZE_BANDWIDTH = 35;
public static final int NET_CAPABILITY_PRIORITIZE_LATENCY = 34;
public static final int NET_CAPABILITY_RCS = 8;
public static final int NET_CAPABILITY_SUPL = 1;
public static final int NET_CAPABILITY_TEMPORARILY_NOT_METERED = 25;
public static final int NET_CAPABILITY_TRUSTED = 14;
public static final int NET_CAPABILITY_VALIDATED = 16;
public static final int NET_CAPABILITY_WIFI_P2P = 6;
public static final int NET_CAPABILITY_XCAP = 9;
  1. 核心网络能力
网络能力说明
NET_CAPABILITY_INTERNET网络配置了互联网访问,但不一定真正连通
NET_CAPABILITY_VALIDATED系统已验证网络可以访问互联网
NET_CAPABILITY_NOT_METERED网络是非计费的,例如,Wi-Fi
NET_CAPABILITY_NOT_RESTRICTED网络没有带宽限制
NET_CAPABILITY_TRUSTED网络是可信的
NET_CAPABILITY_NOT_VPN网络不是 VPN
NET_CAPABILITY_CAPTIVE_PORTAL网络存在强制门户,需要网页认证
  1. 运营商专项服务能力
网络能力说明
NET_CAPABILITY_MMS支持 MMS(彩信)服务
NET_CAPABILITY_SUPL支持 SUPL(GPS 辅助定位)
NET_CAPABILITY_DUN支持拨号上网网络共享(DUN)
NET_CAPABILITY_FOTA支持固件无线升级(FOTA)
NET_CAPABILITY_IMS支持 IP 多媒体子系统(VoLTE 等)
NET_CAPABILITY_CBS支持运营商广播服务(CBS)
NET_CAPABILITY_RCS支持富通信服务(RCS)
NET_CAPABILITY_XCAP支持 XML 配置访问协议
NET_CAPABILITY_EIMS支持企业 IP 多媒体子系统
NET_CAPABILITY_MMTEL支持多媒体电话服务
  1. 网络状态与性能能力
网络能力说明
NET_CAPABILITY_NOT_ROAMING设备不在漫游状态
NET_CAPABILITY_FOREGROUND应用在前台运行,网络优先级较高
NET_CAPABILITY_NOT_CONGESTED网络不拥堵
NET_CAPABILITY_NOT_SUSPENDED网络未被挂起
NET_CAPABILITY_TEMPORARILY_NOT_METERED临时性非计费状态
NET_CAPABILITY_PRIORITIZE_LATENCY优先考虑低延迟
NET_CAPABILITY_PRIORITIZE_BANDWIDTH优先考虑高带宽
  1. 特殊用途能力
网络能力说明
NET_CAPABILITY_WIFI_P2P支持 Wi-Fi 直连(P2P)
NET_CAPABILITY_IA支持初始连接
NET_CAPABILITY_MCX支持任务关键通信
NET_CAPABILITY_ENTERPRISE支持企业网络
NET_CAPABILITY_HEAD_UNIT支持车载主机单元

四、NetworkCapabilities 实例实操

1、获取网络类型
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager == null) {
Log.i(TAG, "connectivityManager 为 null");
return;
}
Network activeNetwork = connectivityManager.getActiveNetwork();
if (activeNetwork == null) {
Log.i(TAG, "activeNetwork 为 null");
return;
}
NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork);
if (networkCapabilities == null) {
Log.i(TAG, "networkCapabilities 为 null");
return;
}
String networkType = "其他";
if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
networkType = "WIFI";
} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
networkType = "移动网络";
} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {
networkType = "以太网";
}
Log.i(TAG, "网络类型:" + networkType);
2、监听网络状态变化
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager == null) {
Log.i(TAG, "connectivityManager 为 null");
return;
}
NetworkRequest networkRequest = new NetworkRequest.Builder().addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).build();
connectivityManager.registerNetworkCallback(networkRequest, new ConnectivityManager.NetworkCallback() {
// 当网络连接成功且可用时调用
@Override
public void onAvailable(@NonNull Network network) {
super.onAvailable(network);
Log.i(TAG, "网络已连接");
}
// 当网络连接丢失时调用
@Override
public void onLost(@NonNull Network network) {
super.onLost(network);
Log.i(TAG, "网络已断开");
}
// 当网络能力发生变化时调用
@Override
public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
super.onCapabilitiesChanged(network, networkCapabilities);
String networkType = "其他";
if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
networkType = "WIFI";
} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
networkType = "移动网络";
} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {
networkType = "以太网";
}
Log.i(TAG, "网络类型:" + networkType);
if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
Log.i(TAG, "系统已验证网络可以访问互联网");
} else {
Log.i(TAG, "系统未验证网络");
}
}
});
  1. 启动应用
# 输出结果
网络已连接
网络类型:WIFI
系统已验证网络可以访问互联网
  1. 关闭 Wi-Fi
# 输出结果
网络已断开
  1. 重新打开 Wi-Fi
# 输出结果
网络已连接
网络类型:WIFI
系统未验证网络
网络类型:WIFI
系统已验证网络可以访问互联网
网络类型:WIFI
系统已验证网络可以访问互联网
网络类型:WIFI
系统已验证网络可以访问互联网
网络类型:WIFI
系统已验证网络可以访问互联网
网络类型:WIFI
系统已验证网络可以访问互联网
网络类型:WIFI
系统已验证网络可以访问互联网
posted @ 2025-10-25 19:10  yjbjingcha  阅读(2)  评论(0)    收藏  举报