package cn.hotapk.fastandrutils.utils;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiManager;
import android.telephony.TelephonyManager;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Method;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.URLDecoder;
import java.net.UnknownHostException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
/**
* @author laijian
* @version 2017/9/15
* @Copyright (C)下午2:09 , www.hotapk.cn
*
* 网络类
*/
public final class FNetworkUtils {
private FNetworkUtils() {
}
/**
* 打开网络设置界面
*/
public static void openWirelessSettings() {
FUtils.getAppContext().startActivity(new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
}
/**
* 获取活动网络信息
*
需添加权限 {@code }
*
* @return NetworkInfo
*/
private static NetworkInfo getActiveNetworkInfo() {
return ((ConnectivityManager) FUtils.getAppContext().getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
}
/**
* 判断网络是否连接
* 需添加权限 {@code }
*
* @return {@code true}: 是
{@code false}: 否
*/
public static boolean isConnected() {
NetworkInfo info = getActiveNetworkInfo();
return info != null && info.isConnected();
}
/**
* 获取网络运营商名称
* 中国移动、如中国联通、中国电信
*
* @return 运营商名称
*/
public static String getNetworkOperatorName() {
TelephonyManager tm = (TelephonyManager) FUtils.getAppContext().getSystemService(Context.TELEPHONY_SERVICE);
return tm != null ? tm.getNetworkOperatorName() : null;
}
/**
* 判断网络连接是否打开,包括移动数据连接
*
* @return 是否联网
*/
public static boolean isNetworkAvailable() {
boolean netstate = false;
ConnectivityManager connectivity = (ConnectivityManager) FUtils.getAppContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null) {
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null) {
for (int i = 0; i < info.length; i++) {
if (info[i].getState() == NetworkInfo.State.CONNECTED) {
netstate = true;
break;
}
}
}
}
return netstate;
}
/**
* 检测当前打开的网络类型是否WIFI
*
* @return 是否是Wifi上网
*/
public static boolean isWifi() {
ConnectivityManager connectivityManager = (ConnectivityManager) FUtils.getAppContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
return activeNetInfo != null
&& activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI;
}
/**
* 检测当前打开的网络类型是否3G
*
* @return 是否是3G上网
*/
public static boolean is3G() {
ConnectivityManager connectivityManager = (ConnectivityManager) FUtils.getAppContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
return activeNetInfo != null
&& activeNetInfo.getType() == ConnectivityManager.TYPE_MOBILE;
}
/**
* 检测当前开打的网络类型是否4G
*
* @return 是否是4G上网
*/
public static boolean is4G() {
ConnectivityManager connectivityManager = (ConnectivityManager) FUtils.getAppContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
if (activeNetInfo != null && activeNetInfo.isConnectedOrConnecting()) {
if (activeNetInfo.getType() == TelephonyManager.NETWORK_TYPE_LTE) {
return true;
}
}
return false;
}
/**
* 打开或关闭移动数据
* 需系统应用 需添加权限{@code }
*
* @param enabled {@code true}: 打开
{@code false}: 关闭
*/
public static void setDataEnabled(final boolean enabled) {
try {
TelephonyManager tm = (TelephonyManager) FUtils.getAppContext().getSystemService(Context.TELEPHONY_SERVICE);
Method setMobileDataEnabledMethod = tm.getClass().getDeclaredMethod("setDataEnabled", boolean.class);
if (null != setMobileDataEnabledMethod) {
setMobileDataEnabledMethod.invoke(tm, enabled);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 打开或关闭wifi
* 需添加权限 {@code }
*
* @param enabled {@code true}: 打开
{@code false}: 关闭
*/
public static void setWifiEnabled(final boolean enabled) {
WifiManager wifiManager = (WifiManager) FUtils.getAppContext().getApplicationContext().getSystemService(Context.WIFI_SERVICE);
if (enabled) {
if (!wifiManager.isWifiEnabled()) {
wifiManager.setWifiEnabled(true);
}
} else {
if (wifiManager.isWifiEnabled()) {
wifiManager.setWifiEnabled(false);
}
}
}
/**
* 获取URL中参数 并返回Map
*
* @param url
* @return
*/
public static Map getUrlParams(String url) {
Map params = null;
try {
String[] urlParts = url.split("\\?");
if (urlParts.length > 1) {
params = new HashMap<>();
String query = urlParts[1];
for (String param : query.split("&")) {
String[] pair = param.split("=");
String key = URLDecoder.decode(pair[0], "UTF-8");
String value = "";
if (pair.length > 1) {
value = URLDecoder.decode(pair[1], "UTF-8");
}
params.put(key, value);
}
}
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
}
return params;
}
/**
* 获取ip地址
*/
public static String getIPAddress() {
WifiManager wifiManager = (WifiManager) FUtils.getAppContext().getApplicationContext().getSystemService(Context.WIFI_SERVICE);
int ipAddress = wifiManager.getConnectionInfo().getIpAddress();
final String formatedIpAddress = String.format("%d.%d.%d.%d", (ipAddress & 0xff), (ipAddress >> 8 & 0xff), (ipAddress >> 16 & 0xff), (ipAddress >> 24 & 0xff));
return formatedIpAddress;
}
/**
* 获取IP地址
* 需添加权限 {@code }
*
* @param useIPv4 是否用IPv4
* @return IP地址
*/
public static String getIPAddress(final boolean useIPv4) {
try {
for (Enumeration nis = NetworkInterface.getNetworkInterfaces(); nis.hasMoreElements(); ) {
NetworkInterface ni = nis.nextElement();
// 防止小米手机返回10.0.2.15
if (!ni.isUp()) continue;
for (Enumeration addresses = ni.getInetAddresses(); addresses.hasMoreElements(); ) {
InetAddress inetAddress = addresses.nextElement();
if (!inetAddress.isLoopbackAddress()) {
String hostAddress = inetAddress.getHostAddress();
boolean isIPv4 = hostAddress.indexOf(':') < 0;
if (useIPv4) {
if (isIPv4) return hostAddress;
} else {
if (!isIPv4) {
int index = hostAddress.indexOf('%');
return index < 0 ? hostAddress.toUpperCase() : hostAddress.substring(0, index).toUpperCase();
}
}
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
return null;
}
/**
* 获取域名ip地址
* 需添加权限 {@code }
*
* @param domain 域名
* @return ip地址
*/
public static String getDomainAddress(final String domain) {
InetAddress inetAddress;
try {
inetAddress = InetAddress.getByName(domain);
return inetAddress.getHostAddress();
} catch (UnknownHostException e) {
e.printStackTrace();
return null;
}
}
/**
* 判断当前是否网络连接
*
* @return 状态码
*/
public NetState getNetworkType() {
NetState stateCode = NetState.NET_NO;
ConnectivityManager cm = (ConnectivityManager) FUtils.getAppContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
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;
default:
stateCode = NetState.NET_UNKNOWN;
}
break;
default:
stateCode = NetState.NET_UNKNOWN;
}
}
return stateCode;
}
/**
* 枚举网络状态 NET_NO:没有网络 NET_2G:2g网络 NET_3G:3g网络 NET_4G:4g网络 NET_WIFI:wifi
* NET_UNKNOWN:未知网络
*/
public enum NetState {
NET_NO, NET_2G, NET_3G, NET_4G, NET_WIFI, NET_UNKNOWN
}
}