目录
Android中使用ConnectivityManager(连接管理器)对网络连接进行管理;该管理器管理全部网络连接,包括WiFi、移动数据连接等,如仅需管理WiFi可使用WiFiManager。
ConnectivityManager(连接管理器),可获取网络连接状态,获取网络信息。
一、获取网络信息
可使用ConnectivityManager的getActiveNetworkInfo方法获取网络信息(NetworkInfo)实例,NetworkInfo实例中包含了网络的各种信息,根据需要按方法获取即可。
1.权限
<!--联网权限,无需动态申请-->
<uses-permission android:name="android.permission.INTERNET"/>
<!--查看网络状态,无需动态申请-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
2.获取网络信息
(1) ConnectivityManager方法:
- getActiveNetworkInfo():获取当前网络连接的网络信息(NetworkInfo)实例,如当前无网络连接则返回null。
(2) NetworkInfo方法:
- isConnected():判断网络是否已连接。返回boolean。
- isAvaible():判断网络是否可用(需要先判断是否已连接网络)。返回boolean。
- getState():获取网络状态。取值为Network.State.CONNECTING,正在连接;CONNECTED,已连接;SUSPENDED,已挂起;DISCONNECTING,正在断开;DISCONNECTED,已断开;UNKNOWN,未知。
- getType():获取网络类型。取值为ConnectivityManager.TYPE_WIFI,wifi;TYPE_MOBILE,数据连接;TYPE_WIMAX,wimax;TYPE_ETHERENT,以太网;TYPE_BLUETOOTH,蓝牙;TYPE_VPN,vpn。
- getSubtype():获取网络子类型(移动数据子类型)。当网络类型为数据连接时子类型为2G/3G/4G的细分类型,如CDMA、EVDO、HSDPA、LTE等。取值为TelephonyManager.NETWORK_TYPE_GPRS,2G;EDGE,2G;1xRTT,2G;CDMA,2G;IDEN,2G;GSM,2G;UMTS,3G;EVDO_0,3G;EVDO_A,3G;EVDO_B,3G;EHRPD,3G;HSPAP,3G;HSDPA,3G;HSUPA,3G;TD_SCDAM,3G;LTE,4G;IWLAN,4G;NR,5G。
/**
* 判断网络是否可用-简易版
* @return true=可用 false=不可用
*/
private boolean networkCanUse(Context context){
ConnectivityManager connectivityManager= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();
if(networkInfo==null||!networkInfo.isConnected()||!networkInfo.isAvailable()){
return false;
}
return true;
}
//获取连接管理器
ConnectivityManager connectivityManager= (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
//获取网络信息
NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();
//判断是否有网络连接
if(networkInfo==null){
//无网络
textView.setText("无网络");
return;
}
//获取网络状态
NetworkInfo.State networkState=networkInfo.getState();
if(networkState!= NetworkInfo.State.CONNECTED){
//未连接
textView.setText("网络未连接");
return;
}
//获取网络是否可用
if(!networkInfo.isAvaible()){
//不可用
textView.setText("网络不可用");
return;
}
//获取网络类型
int networkType=networkInfo.getType();
if(networkType==ConnectivityManager.TYPE_WIFI){
//WiFi
textView.setText("连接WiFi");
}
else if(networkType==ConnectivityManager.TYPE_MOBILE){
//移动数据
textView.setText("连接移动数据");
//获取网络子类型
int subtype=networkInfo.getSubtype();
if(subtype==TelephonyManager.NETWORK_TYPE_LTE|subtype==TelephonyManager.NETWORK_TYPE_IWLAN){
textView.setText("连接4G");
}
}else {
//其他
textView.setText("连接其他网络");
}
3.网络连接状态工具类
根据ConnectivityManager(连接管理器)编写了如下工具类,其中方法用于获取当前网络状况。
class NetworkUtils{
/**
* 用于确认当前网络信息的方法
* @return -1=无网络连接 0=网络断连 1=WiFi连接 2=4G连接 3=5G连接 4=其他移动数据连接 5=其他网络连接
*/
private int checkNowNetwork(Context context){
//获取连接管理器
ConnectivityManager connectivityManager= (ConnectivityManager) context.getSystemService(CONNECTIVITY_SERVICE);
//获取网络信息
NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();
if(networkInfo==null){
//无网络
return -1;
}
//获取网络状态
NetworkInfo.State state=networkInfo.getState();
if(state!=NetworkInfo.State.CONNECTED){
return 0;
}
//获取网络类型
int type=networkInfo.getType();
if(type==ConnectivityManager.TYPE_WIFI){
return 1;
}
else if (type==ConnectivityManager.TYPE_MOBILE) {
//获取网络子类型
int subtype=networkInfo.getSubtype();
if(subtype== TelephonyManager.NETWORK_TYPE_LTE|subtype==TelephonyManager.NETWORK_TYPE_IWLAN){
//4G
return 2;
} else if (subtype==TelephonyManager.NETWORK_TYPE_NR) {
//5G
return 3;
}
else {
//其他移动数据连接
return 4;
}
}
else {
//其他网络连接
return 5;
}
}
}
二、开关网络
Android手机的网络功能一般有两种,WiFi网络和移动数据网络。
1.权限
<!--查看数据网络状态,无需动态申请-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--查看WiFi网络状态,无需动态申请-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
2.开关网络功能
(1) WiFi网络
使用WiFiManager(WiFi管理器)获取WiFi状态及设置WiFi状态。
//获取WiFi状态
public static boolean getWiFiState(Context context){
WifiManager wifiManager= (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
return wifiManager.isWifiEnabled();
}
//设置WiFi状态
public static void setWiFiState(Context context,boolean state){
WifiManager wifiManager= (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(state);
}
(2) 移动数据网络
使用ConnectivityManager(连接管理器)获取移动数据连接状态及设置连接状态;请注意因为是隐藏方法,需要通过反射调用。
//获取移动数据连接开关的状态
public static boolean getMobileDataState(Context context){
//获取连接管理器
ConnectivityManager connectivityManager= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
boolean isOpen=false;
try {
//该方法为隐藏方法,需要通过反射调用
String methodName="getMobileDataEnable";
Method method=connectivityManager.getClass().getMethod(methodName);
isOpen= (boolean) method.invoke(connectivityManager);
}catch (Exception e){
e.printStackTrace();
}
return isOpen;
}
//设置移动数据连接开关的状态
public static void setMobileDataState(Context context,boolean state){
//获取连接管理器
ConnectivityManager connectivityManager= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
try{
//该方法为隐藏方法,需要通过反射调用
String methodName="setMobileDataEnable";
Method method=connectivityManager.getClass().getMethod(methodName);
method.invoke(connectivityManager,state);
}catch (Exception e){
e.printStackTrace();
}
}
tag:网络连接,网络数据,WiFi,移动数据,系统服务;网络状态;网络连接状态;互联网;判断网络是否可用