package com.yuyh.library.utils.network;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.location.LocationManager;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.IBinder;
import android.telephony.TelephonyManager;
import android.util.Log;
import com.yuyh.library.AppUtils;
import com.yuyh.library.utils.log.LogUtils;
import java.lang.reflect.Method;
/**
* @author yuyh.
* @date 16/4/9.
*/
public class NetworkUtils {
private static final String TAG = Network.class.getSimpleName();
/**
* 接受网络状态的广播Action
*/
public static final String NET_BROADCAST_ACTION = "com.network.state.action";
public static final String NET_STATE_NAME = "network_state";
/**
* 实时更新网络状态<br>
* -1为网络无连接<br>
* 1为WIFI<br>
* 2为移动网络<br>
*/
public static int CURRENT_NETWORK_STATE = -1;
public enum NetType {
None(1, "无网络连接"),
Mobile(2, "蜂窝移动网络"),
Wifi(4, "Wifi网络"),
Other(8, "未知网络");
NetType(int value, String desc) {
this.value = value;
this.desc = desc;
}
public int value;
public String desc;
}
public enum NetWorkType {
UnKnown(-1, "未知网络"),
Wifi(1, "Wifi网络"),
Net2G(2, "2G网络"),
Net3G(3, "3G网络"),
Net4G(4, "4G网络");
NetWorkType(int value, String desc) {
this.value = value;
this.desc = desc;
}
public int value;
public String desc;
}
/**
* 获取ConnectivityManager
*/
public static ConnectivityManager getConnectivityManager(Context context) {
return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
}
/**
* 获取TelephonyManager
*/
public static TelephonyManager getTelephonyManager(Context context) {
return (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
}
/**
* 判断网络是否连接(包含MobileNet,Wifi)
*
* @return
*/
public static boolean isConnected(Context context) {
NetworkInfo net = getConnectivityManager(context).getActiveNetworkInfo();
return net != null && net.isConnected();
}
/**
* 判断有无网络正在连接中或已连接(查找网络、校验、获取IP等)(包含MobileNet,Wifi)
*
* @return
*/
public static boolean isConnectedOrConnecting(Context context) {
NetworkInfo[] nets = getConnectivityManager(context).getAllNetworkInfo();
if (nets != null) {
for (NetworkInfo net : nets) {
if (net.isConnectedOrConnecting()) {
return true;
}
}
}
return false;
}
/**
* 获取当前网络类型(Wifi或移动网络)
*
* @param context
* @return
*/
public static NetType getConnectedType(Context context) {
NetworkInfo net = getConnectivityManager(context).getActiveNetworkInfo();
if (net != null) {
switch (net.getType()) {
case ConnectivityManager.TYPE_WIFI:
return NetType.Wifi;
case ConnectivityManager.TYPE_MOBILE:
return NetType.Mobile;
default:
return NetType.Other;
}
}
return NetType.None;
}
/**
* 是否存在有效的WIFI连接
*
* @param context
* @return
*/
public static boolean isWifiConnected(Context context) {
NetworkInfo net = getConnectivityManager(context).getActiveNetworkInfo();
return net != null && net.getType() == ConnectivityManager.TYPE_WIFI && net.isConnected();
}
/**
* 是否存在有效的移动连接
*
* @param context
* @return
*/
public static boolean isMobileConnected(Context context) {
NetworkInfo net = getConnectivityManager(context).getActiveNetworkInfo();
return net != null && net.getType() == ConnectivityManager.TYPE_MOBILE && net.isConnected();
}
/**
* 检测当前网络是否可用
*
* @param context
* @return
*/
public static boolean isAvailable(Context context) {
return isWifiAvailable(context) || (isMobileAvailable(context) && isMobileEnabled(context));
}
/**
* 判断是否有可用状态的Wifi,以下情况返回false:
* 1. 设备wifi开关关掉;
* 2. 已经打开飞行模式;
* 3. 设备所在区域没有信号覆盖;
* 4. 设备在漫游区域,且关闭了网络漫游。
*
* @param context
* @return boolean wifi为可用状态(不一定成功连接,即Connected)即返回ture
*/
public static boolean isWifiAvailable(Context context) {
NetworkInfo[] nets = getConnectivityManager(context).getAllNetworkInfo();
if (nets != null) {
for (NetworkInfo net : nets) {
if (net.getType() == ConnectivityManager.TYPE_WIFI) {
return net.isAvailable();
}
}
}
return false;
}
/**
* 判断有无可用状态的移动网络,注意关掉设备移动网络直接不影响此函数。
* 也就是即使关掉移动网络,那么移动网络也可能是可用的(彩信等服务),即返回true。
* 以下情况它是不可用的,将返回false:
* 1. 设备打开飞行模式;
* 2. 设备所在区域没有信号覆盖;
* 3. 设备在漫游区域,且关闭了网络漫游。
*
* @param context
* @return boolean
*/
public static boolean isMobileAvailable(Context context) {
NetworkInfo[] nets = getConnectivityManager(context).getAllNetworkInfo();
if (nets != null) {
for (NetworkInfo net : nets) {
if (net.getType() == ConnectivityManager.TYPE_MOBILE) {
return net.isAvailable();
}
}
}
return false;
}
/**
* 设备是否打开蜂窝移动网络开关
*
* @param context
* @return
*/
public static boolean isMobileEnabled(Context context) {
try {
Method getMobileDataEnabledMethod = ConnectivityManager.class.getDeclaredMethod("getMobileDataEnabled");
getMobileDataEnabledMethod.setAccessible(true);
return (Boolean) getMobileDataEnabledMethod.invoke(getConnectivityManager(context));
} catch (Exception e) {
e.printStackTrace();
}
return true;// 反射失败,默认开启
}
/**
* 打印当前各种网络状态
*
* @return boolean
*/
public static boolean printNetworkInfo(Context context) {
ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null) {
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null) {
for (int i = 0; i < info.length; i++) {
LogUtils.i(TAG, "NetworkInfo[" + i + "]isAvailable : " + info[i].isAvailable());
LogUtils.i(TAG, "NetworkInfo[" + i + "]isConnected : " + info[i].isConnected());
LogUtils.i(TAG, "NetworkInfo[" + i + "]isConnectedOrConnecting : " + info[i].isConnectedOrConnecting());
LogUtils.i(TAG, "NetworkInfo[" + i + "]: " + info[i]);
}
LogUtils.i(TAG, "\n");
} else {
LogUtils.i(TAG, "getAllNetworkInfo is null");
}
}
return false;
}
/**
* get connected network type by {@link ConnectivityManager}
* <p/>
* such as WIFI, MOBILE, ETHERNET, BLUETOOTH, etc.
*
* @return {@link ConnectivityManager#TYPE_WIFI}, {@link ConnectivityManager#TYPE_MOBILE},
* {@link ConnectivityManager#TYPE_ETHERNET}...
*/
public static int getConnectedTypeINT(Context context) {
NetworkInfo net = getConnectivityManager(context).getActiveNetworkInfo();
if (net != null) {
return net.getType();
}
return -1;
}
/**
* 获取网络连接类型
* <p/>
* GPRS 2G(2.5) General Packet Radia Service 114kbps
* EDGE 2G(2.75G) Enhanced Data Rate for GSM Evolution 384kbps
* UMTS 3G WCDMA 联通3G Universal Mobile Telecommunication System 完整的3G移动通信技术标准
* CDMA 2G 电信 Code Division Multiple Access 码分多址
* EVDO_0 3G (EVDO 全程 CDMA2000 1xEV-DO) Evolution - Data Only (Data Optimized) 153.6kps - 2.4mbps 属于3G
* EVDO_A 3G 1.8mbps - 3.1mbps 属于3G过渡,3.5G
* 1xRTT 2G CDMA2000 1xRTT (RTT - 无线电传输技术) 144kbps 2G的过渡,
* HSDPA 3.5G 高速下行分组接入 3.5G WCDMA High Speed Downlink Packet Access 14.4mbps
* HSUPA 3.5G High Speed Uplink Packet Access 高速上行链路分组接入 1.4 - 5.8 mbps
* HSPA 3G (分HSDPA,HSUPA) High Speed Packet Access
* IDEN 2G Integrated Dispatch Enhanced Networks 集成数字增强型网络 (属于2G,来自维基百科)
* EVDO_B 3G EV-DO Rev.B 14.7Mbps 下行 3.5G
* LTE 4G Long Term Evolution FDD-LTE 和 TDD-LTE , 3G过渡,升级版 LTE Advanced 才是4G
* EHRPD 3G CDMA2000向LTE 4G的中间产物 Evolved High Rate Packet Data HRPD的升级
* HSPAP 3G HSPAP 比 HSDPA 快些
*
* @return {@link NetWorkType}
*/
public static NetWorkType getNetworkType(Context context) {
int type = getConnectedTypeINT(context);
switch (type) {
case ConnectivityManager.TYPE_WIFI:
return NetWorkType.Wifi;
case ConnectivityManager.TYPE_MOBILE:
case ConnectivityManager.TYPE_MOBILE_DUN:
case ConnectivityManager.TYPE_MOBILE_HIPRI:
case ConnectivityManager.TYPE_MOBILE_MMS:
case ConnectivityManager.TYPE_MOBILE_SUPL:
int teleType = getTelephonyManager(context).getNetworkType();
switch (teleType) {
case TelephonyManager.NETWORK_TYPE_GPRS:
case TelephonyManager.NETWORK_TYPE_EDGE:
case TelephonyManager.NETWORK_TYPE_CDMA:
case TelephonyManager.NETWORK_TYPE_1xRTT:
case TelephonyManager.NETWORK_TYPE_IDEN:
return NetWorkType.Net2G;
case TelephonyManager.NETWORK_TYPE_UMTS:
case TelephonyManager.NETWORK_TYPE_EVDO_0:
case TelephonyManager.NETWORK_TYPE_EVDO_A:
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:
return NetWorkType.Net3G;
case TelephonyManager.NETWORK_TYPE_LTE:
return NetWorkType.Net4G;
default:
return NetWorkType.UnKnown;
}
default:
return NetWorkType.UnKnown;
}
}
/**
* 判断GPS是否开启,GPS或者AGPS开启一个就认为是开启的
*
* @return true 表示开启
*/
public static final boolean isGpsEnabled() {
LocationManager locationManager = (LocationManager) AppUtils.getAppContext().getSystemService(Context.LOCATION_SERVICE);
boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); // GPS
boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); // WLAN或移动网络(3G/2G)
if (gps || network) {
Log.i("demo", "GPS Ensable");
return true;
}
return false;
}
/**
* 强制帮用户打开GPS
*/
public static final void openGPS() {
Intent GPSIntent = new Intent();
GPSIntent.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider");
GPSIntent.addCategory("android.intent.category.ALTERNATIVE");
GPSIntent.setData(Uri.parse("custom:3"));
try {
PendingIntent.getBroadcast(AppUtils.getAppContext(), 0, GPSIntent, 0).send();
} catch (PendingIntent.CanceledException e) {
e.printStackTrace();
}
}
/**
* 打开网络设置界面
*/
public static void openSetting(Activity activity) {
Intent intent = null;
//判断手机系统的版本 即API大于10 就是3.0或以上版本
if (android.os.Build.VERSION.SDK_INT > 10) {
intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS);
} else {
intent = new Intent();
ComponentName component = new ComponentName("com.android.settings", "com.android.settings.WirelessSettings");
intent.setComponent(component);
intent.setAction("android.intent.action.VIEW");
}
activity.startActivity(intent);
}
/**
* 开启服务,实时监听网络变化(需要在清单文件配置Service)
*
* @param context
*/
public static void startNetService(final Context context) {
//注册广播
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(NET_BROADCAST_ACTION);
context.registerReceiver(mReceiver, intentFilter);
//开启服务
Intent intent = new Intent(context, NetworkService.class);
context.bindService(intent, new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
}
}, Context.BIND_AUTO_CREATE);
}
/**
* 接受服务上发过来的广播
*/
private static BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null) {
CURRENT_NETWORK_STATE = (Integer) intent.getExtras().get(NET_STATE_NAME);
switch (CURRENT_NETWORK_STATE) {
case -1:
LogUtils.d("网络更改为 无网络 CURRENT_NETWORK_STATE =" + CURRENT_NETWORK_STATE);
break;
case 1:
LogUtils.d("网络更改为 WIFI网络 CURRENT_NETWORK_STATE=" + CURRENT_NETWORK_STATE);
break;
case 2:
LogUtils.d("网络更改为 移动网络 CURRENT_NETWORK_STATE =" + CURRENT_NETWORK_STATE);
break;
default:
break;
}
}
}
};
}