x度找的,测试啦一下,可以用,然后记录一下,低版本的网上全都是,就不贴啦.
要注意有2个权限,ACCESS_NETWORK_STATE:网络变化 ; READ_PHONE_STATE:信号类型(4g,3g),没有权限是得不到想要的结果,会一直得到0
/**
* Android10监听网络变化广播
* updateState 更新view用的函数,注意里面要在主线程使用
*/
ConnectivityManager.NetworkCallback mNetworkCallback = null;
// 注册回调
private void registerNetworkCallback(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
final ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (mNetworkCallback == null)
mNetworkCallback = new ConnectivityManager.NetworkCallback() {
// 可用网络接入
public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
L.d(TAG,"ConnectivityManager onCapabilitiesChanged ");
// 一般在此处获取网络类型然后判断网络类型,就知道时哪个网络可以用connected
if(networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)){//WIFI
updateState(true,network,networkCapabilities);
}else if(networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)){//移动数据
updateState(true,network,networkCapabilities);
}else {
updateState(false);
}
}
// 网络断开
public void onLost(Network network) {
L.d(TAG,"ConnectivityManager onLost ");
// 如果通过ConnectivityManager#getActiveNetwork()返回null,表示当前已经没有其他可用网络了。
updateState(false);
}
};
NetworkRequest.Builder builder = new NetworkRequest.Builder();
builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
builder.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
if (mNetworkCallback!=null)
cm.registerNetworkCallback(builder.build(), mNetworkCallback);
}
}
// 注销回调
private void unregisterNetworkCallback(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
if (mNetworkCallback != null) {
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
cm.unregisterNetworkCallback(mNetworkCallback);
}
}
}
/**
* 枚举网络状态 NET_NO:没有网络 NET_2G:2g网络 NET_3G:3g网络 NET_4G:4g网络 NET_WIFI:wifi
* NET_UNKNOWN:未知网络
*/
public class NetState {
public static final int NET_NO_CONNECT = 0;
public static final int NET_WIFI = 1;
public static final int NET_2G = 2;
public static final int NET_3G = 3;
public static final int NET_4G = 4;
public static final int NET_5G = 5;
public static final int NET_UNKNOWN = -1;
/**
* 没有READ_PHONE_STATE 权限,不过是可以知道当前是 移动网络,不是wifi
*/
public static final int NOT_PERMISSION_READ_PHONE_STATE_ONLY_GPRS = -2;
public static final int NOT_PERMISSION_ACCESS_NETWORK_STATE = -3;
}
@IntDef({NetState.NET_NO_CONNECT, NetState.NET_2G, NetState.NET_3G, NetState.NET_4G, NetState.NET_5G
, NetState.NET_UNKNOWN, NetState.NET_WIFI
,NetState.NOT_PERMISSION_ACCESS_NETWORK_STATE,NetState.NOT_PERMISSION_READ_PHONE_STATE_ONLY_GPRS})
public @interface NetStateInt {
}
/**
* 判断当前网络连接
* android N 以上用 NetworkCapabilities 和 TelephonyManager.getDataNetworkType()
*
* {ACCESS_NETWORK_STATE (必须) , READ_PHONE_STATE (可无,有的话可以判断是 3g/4g)}
* @param context 上下文
* @return 状态码 @NetStateInt
*/
public static @NetStateInt int getNetType(Context context,Network network
,NetworkCapabilities netCapabilities) {
int stateCode = NetState.NET_UNKNOWN;
final String tag_ = "getNetType";
// ACCESS_NETWORK_STATE
if (!FucUtil.checkPermission(context
, new String[]{Manifest.permission.ACCESS_NETWORK_STATE})) {
L.d(tag_,"checkPermission ACCESS_NETWORK_STATE");
return NetState.NOT_PERMISSION_ACCESS_NETWORK_STATE;
}
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (SdkCheck.isAndroid7()) {
Network ni = network;
if (ni == null) {
L.d(tag_,"Network is null");
return NetState.NET_NO_CONNECT;
}
NetworkCapabilities capabilities = netCapabilities;
if (capabilities == null) {
L.d(tag_,"NetworkCapabilities is null");
return NetState.NET_NO_CONNECT;
}
if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
stateCode = NetState.NET_WIFI;
} else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
if (!FucUtil.checkPermission(context
, new String[]{Manifest.permission.READ_PHONE_STATE})) {
return NetState.NOT_PERMISSION_READ_PHONE_STATE_ONLY_GPRS;
}
TelephonyManager tm = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
// READ_PHONE_STATE
int type = tm.getDataNetworkType();
if (type == TelephonyManager.NETWORK_TYPE_UNKNOWN){
return NetState.NET_UNKNOWN;
}
// boolean hasCarr = tm.hasCarrierPrivileges();
L.d(tag_,"getNetworkType type =="+type);
// L.d(tag_,"hasCarrierPrivileges =="+hasCarr);
switch (type) {
case TelephonyManager.NETWORK_TYPE_GPRS: // 联通2g
case TelephonyManager.NETWORK_TYPE_CDMA: // 电信2g
case TelephonyManager.NETWORK_TYPE_EDGE: // 移动2g
case TelephonyManager.NETWORK_TYPE_1xRTT:
case TelephonyManager.NETWORK_TYPE_IDEN:
stateCode = NetState.NET_2G;
break;
case TelephonyManager.NETWORK_TYPE_EVDO_A: // 电信3g
case TelephonyManager.NETWORK_TYPE_UMTS:
case TelephonyManager.NETWORK_TYPE_EVDO_0:
case TelephonyManager.NETWORK_TYPE_HSDPA:
case TelephonyManager.NETWORK_TYPE_HSUPA:
case TelephonyManager.NETWORK_TYPE_HSPA:
case TelephonyManager.NETWORK_TYPE_EVDO_B:
case TelephonyManager.NETWORK_TYPE_EHRPD:
case TelephonyManager.NETWORK_TYPE_HSPAP:
stateCode = NetState.NET_3G;
break;
case TelephonyManager.NETWORK_TYPE_LTE:
stateCode = NetState.NET_4G;
break;
case TelephonyManager.NETWORK_TYPE_NR:
stateCode = NetState.NET_5G;
break;
default:
L.d(tag_,"getDataNetworkType type err ");
stateCode = NetState.NET_UNKNOWN;
break;
}
}else {
L.d(tag_,"NetworkCapabilities type err");
stateCode = NetState.NET_NO_CONNECT;
}
} else {
NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni != null && ni.isConnectedOrConnecting()) {
switch (ni.getType()) {
case ConnectivityManager.TYPE_WIFI:
stateCode = NetState.NET_WIFI;
break;
case ConnectivityManager.TYPE_MOBILE:
switch (ni.getSubtype()) {
case TelephonyManager.NETWORK_TYPE_GPRS: // 联通2g
case TelephonyManager.NETWORK_TYPE_CDMA: // 电信2g
case TelephonyManager.NETWORK_TYPE_EDGE: // 移动2g
case TelephonyManager.NETWORK_TYPE_1xRTT:
case TelephonyManager.NETWORK_TYPE_IDEN:
stateCode = NetState.NET_2G;
break;
case TelephonyManager.NETWORK_TYPE_EVDO_A: // 电信3g
case TelephonyManager.NETWORK_TYPE_UMTS:
case TelephonyManager.NETWORK_TYPE_EVDO_0:
case TelephonyManager.NETWORK_TYPE_HSDPA:
case TelephonyManager.NETWORK_TYPE_HSUPA:
case TelephonyManager.NETWORK_TYPE_HSPA:
case TelephonyManager.NETWORK_TYPE_EVDO_B:
case TelephonyManager.NETWORK_TYPE_EHRPD:
case TelephonyManager.NETWORK_TYPE_HSPAP:
stateCode = NetState.NET_3G;
break;
case TelephonyManager.NETWORK_TYPE_LTE:
stateCode = NetState.NET_4G;
break;
case TelephonyManager.NETWORK_TYPE_NR:
stateCode = NetState.NET_5G;
break;
default:
stateCode = NetState.NET_UNKNOWN;
}
break;
default:
stateCode = NetState.NET_UNKNOWN;
}
}
}
return stateCode;
}
网友评论