package me.shouheng.utils.device; import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.WifiManager; import android.os.Build; import android.support.annotation.RequiresPermission; import android.telephony.TelephonyManager; import android.util.Log; import java.lang.reflect.Method; import me.shouheng.utils.UtilsApp; import static android.Manifest.permission.ACCESS_NETWORK_STATE; import static android.Manifest.permission.ACCESS_WIFI_STATE; import static android.Manifest.permission.CHANGE_WIFI_STATE; import static android.Manifest.permission.INTERNET; import static android.Manifest.permission.MODIFY_PHONE_STATE; import static android.content.Context.WIFI_SERVICE; /** * @author WngShhng * @version 2019-05-09 21:20 */ public final class NetworkUtils { public static void openWirelessSettings() { Intent intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); UtilsApp.getApp().startActivity(intent); } @RequiresPermission(ACCESS_NETWORK_STATE) public static boolean isConnected() { NetworkInfo info = getActiveNetworkInfo(); return info != null && info.isConnected(); } @RequiresPermission(INTERNET) public static boolean isAvailableByPing() { return isAvailableByPing(null); } @RequiresPermission(INTERNET) public static boolean isAvailableByPing(String ip) { if (ip == null || ip.length() <= 0) { ip = "223.5.5.5";// default ping ip } ShellUtils.CommandResult result = ShellUtils.execCmd(String.format("ping -c 1 %s", ip), false); boolean ret = result.result == 0; if (result.errorMsg != null) { Log.d("NetworkUtils", "isAvailableByPing() called" + result.errorMsg); } if (result.successMsg != null) { Log.d("NetworkUtils", "isAvailableByPing() called" + result.successMsg); } return ret; } public static boolean isMobileDataEnabled() { try { TelephonyManager tm = (TelephonyManager) UtilsApp.getApp().getSystemService(Context.TELEPHONY_SERVICE); if (tm == null) return false; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { return tm.isDataEnabled(); } @SuppressLint("PrivateApi") Method getMobileDataEnabledMethod = tm.getClass().getDeclaredMethod("getDataEnabled"); if (null != getMobileDataEnabledMethod) { return (boolean) getMobileDataEnabledMethod.invoke(tm); } } catch (Exception e) { e.printStackTrace(); } return false; } @RequiresPermission(MODIFY_PHONE_STATE) public static void setMobileDataEnabled(final boolean enabled) { try { TelephonyManager tm = (TelephonyManager) UtilsApp.getApp().getSystemService(Context.TELEPHONY_SERVICE); if (tm == null) return; Method setMobileDataEnabledMethod = tm.getClass().getDeclaredMethod("setDataEnabled", boolean.class); if (null != setMobileDataEnabledMethod) { setMobileDataEnabledMethod.invoke(tm, enabled); } } catch (Exception e) { e.printStackTrace(); } } @RequiresPermission(ACCESS_NETWORK_STATE) public static boolean isMobileData() { NetworkInfo info = getActiveNetworkInfo(); return null != info && info.isAvailable() && info.getType() == ConnectivityManager.TYPE_MOBILE; } @RequiresPermission(ACCESS_NETWORK_STATE) public static boolean is4G() { NetworkInfo info = getActiveNetworkInfo(); return info != null && info.isAvailable() && info.getSubtype() == TelephonyManager.NETWORK_TYPE_LTE; } @RequiresPermission(ACCESS_WIFI_STATE) public static boolean isWifiEnabled() { @SuppressLint("WifiManagerLeak") WifiManager manager = (WifiManager) UtilsApp.getApp().getSystemService(WIFI_SERVICE); if (manager == null) return false; return manager.isWifiEnabled(); } @RequiresPermission(CHANGE_WIFI_STATE) public static void setWifiEnabled(final boolean enabled) { @SuppressLint("WifiManagerLeak") WifiManager manager = (WifiManager) UtilsApp.getApp().getSystemService(WIFI_SERVICE); if (manager == null) return; if (enabled == manager.isWifiEnabled()) return; manager.setWifiEnabled(enabled); } @RequiresPermission(ACCESS_NETWORK_STATE) public static boolean isWifiConnected() { ConnectivityManager cm = (ConnectivityManager) UtilsApp.getApp().getSystemService(Context.CONNECTIVITY_SERVICE); if (cm == null) return false; NetworkInfo ni = cm.getActiveNetworkInfo(); return ni != null && ni.getType() == ConnectivityManager.TYPE_WIFI; } @RequiresPermission(allOf = {ACCESS_WIFI_STATE, INTERNET}) public static boolean isWifiAvailable() { return isWifiEnabled() && isAvailableByPing(); } public static String getNetworkOperatorName() { TelephonyManager tm = (TelephonyManager) UtilsApp.getApp().getSystemService(Context.TELEPHONY_SERVICE); if (tm == null) return ""; return tm.getNetworkOperatorName(); } @RequiresPermission(ACCESS_NETWORK_STATE) public static NetworkType getNetworkType() { NetworkType netType = NetworkType.NETWORK_NO; NetworkInfo info = getActiveNetworkInfo(); if (info != null && info.isAvailable()) { if (info.getType() == ConnectivityManager.TYPE_ETHERNET) { netType = NetworkType.NETWORK_ETHERNET; } else if (info.getType() == ConnectivityManager.TYPE_WIFI) { netType = NetworkType.NETWORK_WIFI; } else if (info.getType() == ConnectivityManager.TYPE_MOBILE) { switch (info.getSubtype()) { case TelephonyManager.NETWORK_TYPE_GSM: case TelephonyManager.NETWORK_TYPE_GPRS: case TelephonyManager.NETWORK_TYPE_CDMA: case TelephonyManager.NETWORK_TYPE_EDGE: case TelephonyManager.NETWORK_TYPE_1xRTT: case TelephonyManager.NETWORK_TYPE_IDEN: netType = NetworkType.NETWORK_2G; break; case TelephonyManager.NETWORK_TYPE_TD_SCDMA: case TelephonyManager.NETWORK_TYPE_EVDO_A: 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: netType = NetworkType.NETWORK_3G; break; case TelephonyManager.NETWORK_TYPE_IWLAN: case TelephonyManager.NETWORK_TYPE_LTE: netType = NetworkType.NETWORK_4G; break; default: String subtypeName = info.getSubtypeName(); if (subtypeName.equalsIgnoreCase("TD-SCDMA") || subtypeName.equalsIgnoreCase("WCDMA") || subtypeName.equalsIgnoreCase("CDMA2000")) { netType = NetworkType.NETWORK_3G; } else { netType = NetworkType.NETWORK_UNKNOWN; } break; } } else { netType = NetworkType.NETWORK_UNKNOWN; } } return netType; } public enum NetworkType { NETWORK_ETHERNET, NETWORK_WIFI, NETWORK_4G, NETWORK_3G, NETWORK_2G, NETWORK_UNKNOWN, NETWORK_NO } /*---------------------------------- inner methods --------------------------------------*/ @RequiresPermission(ACCESS_NETWORK_STATE) private static NetworkInfo getActiveNetworkInfo() { ConnectivityManager cm = (ConnectivityManager) UtilsApp.getApp().getSystemService(Context.CONNECTIVITY_SERVICE); if (cm == null) return null; return cm.getActiveNetworkInfo(); } private NetworkUtils() { throw new UnsupportedOperationException("u can't initialize me!"); } }