一、NetworkCapabilities 概述
-
NetworkCapabilities 包含有关网络属性的信息,例如传输类型(Wi-Fi、移动网络、蓝牙等)以及网络能力
-
可以通过 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;
- 主要传输类型
传输类型 | 说明 |
---|
TRANSPORT_CELLULAR | 蜂窝移动网络(2G / 3G / 4G / 5G) |
TRANSPORT_WIFI | Wi-Fi 无线网络 |
TRANSPORT_BLUETOOTH | 蓝牙网络 |
TRANSPORT_ETHERNET | 有线以太网 |
TRANSPORT_VPN | VPN 虚拟专用网络 |
- 特殊用途传输类型
传输类型 | 说明 |
---|
TRANSPORT_WIFI_AWARE | Wi-Fi Aware(邻近感知网络) |
TRANSPORT_LOWPAN | 低功耗无线个域网(IoT 设备) |
TRANSPORT_USB | USB 网络共享 |
TRANSPORT_THREAD | Thread 协议(物联网 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;
- 核心网络能力
网络能力 | 说明 |
---|
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 | 网络存在强制门户,需要网页认证 |
- 运营商专项服务能力
网络能力 | 说明 |
---|
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 | 支持多媒体电话服务 |
- 网络状态与性能能力
网络能力 | 说明 |
---|
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 | 优先考虑高带宽 |
- 特殊用途能力
网络能力 | 说明 |
---|
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() {@Overridepublic void onAvailable(@NonNull Network network) {super.onAvailable(network);Log.i(TAG, "网络已连接");}@Overridepublic void onLost(@NonNull Network network) {super.onLost(network);Log.i(TAG, "网络已断开");}@Overridepublic 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, "系统未验证网络");}}
});
- 启动应用
# 输出结果网络已连接
网络类型:WIFI
系统已验证网络可以访问互联网
- 关闭 Wi-Fi
# 输出结果网络已断开
- 重新打开 Wi-Fi
# 输出结果网络已连接
网络类型:WIFI
系统未验证网络
网络类型:WIFI
系统已验证网络可以访问互联网
网络类型:WIFI
系统已验证网络可以访问互联网
网络类型:WIFI
系统已验证网络可以访问互联网
网络类型:WIFI
系统已验证网络可以访问互联网
网络类型:WIFI
系统已验证网络可以访问互联网
网络类型:WIFI
系统已验证网络可以访问互联网