Android 监听网络状态变化
封装工具类
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
object NetworkUtils {const val NETWORK_NONE = -1const val NETWORK_WIFI = 1const val NETWORK_2G = 2const val NETWORK_3G = 3const val NETWORK_4G = 4const val NETWORK_5G = 5const val NETWORK_UNKNOWN = 6@JvmStatic@RequiresPermission(Manifest.permission.ACCESS_NETWORK_STATE)fun getNetWorkType(context: Context): Int {val connectivityManager =context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManagerval info = connectivityManager.activeNetworkInfo if (info != null && info.isAvailable) {when (info.type) {ConnectivityManager.TYPE_WIFI -> {return NETWORK_WIFI}ConnectivityManager.TYPE_MOBILE -> {when (info.subtype) {TelephonyManager.NETWORK_TYPE_GSM,TelephonyManager.NETWORK_TYPE_GPRS,TelephonyManager.NETWORK_TYPE_CDMA,TelephonyManager.NETWORK_TYPE_EDGE,TelephonyManager.NETWORK_TYPE_1xRTT,TelephonyManager.NETWORK_TYPE_IDEN ->return NETWORK_2GTelephonyManager.NETWORK_TYPE_TD_SCDMA,TelephonyManager.NETWORK_TYPE_EVDO_A,TelephonyManager.NETWORK_TYPE_UMTS,TelephonyManager.NETWORK_TYPE_EVDO_0,TelephonyManager.NETWORK_TYPE_HSDPA,TelephonyManager.NETWORK_TYPE_HSUPA,TelephonyManager.NETWORK_TYPE_HSPA,TelephonyManager.NETWORK_TYPE_EVDO_B,TelephonyManager.NETWORK_TYPE_EHRPD,TelephonyManager.NETWORK_TYPE_HSPAP ->return NETWORK_3GTelephonyManager.NETWORK_TYPE_IWLAN,TelephonyManager.NETWORK_TYPE_LTE ->return NETWORK_4GTelephonyManager.NETWORK_TYPE_NR ->return NETWORK_5Gelse -> {val subtypeName = info.subtypeNamereturn if (subtypeName.equals("TD-SCDMA", ignoreCase = true)|| subtypeName.equals("WCDMA", ignoreCase = true)|| subtypeName.equals("CDMA2000", ignoreCase = true)) {NETWORK_3G} else {NETWORK_UNKNOWN}}}}else -> {return NETWORK_UNKNOWN}}} else {return NETWORK_NONE}}@JvmStaticfun getNetWorkTypeName(context: Context): String {return when (getNetWorkType(context)) {NETWORK_WIFI -> "NETWORK_WIFI"NETWORK_5G -> "NETWORK_5G"NETWORK_4G -> "NETWORK_4G"NETWORK_3G -> "NETWORK_3G"NETWORK_2G -> "NETWORK_2G"NETWORK_NONE -> "NETWORK_NONE"else -> "NETWORK_UNKNOWN"}}@JvmStaticfun isNetworkAvailable(context: Context): Boolean {val connectivityManager =context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManagerval info = connectivityManager.allNetworkInfofor (i in info.indices) {if (info[i].state == NetworkInfo.State.CONNECTED) {return true}}return false}@JvmStatic@RequiresPermission(Manifest.permission.ACCESS_NETWORK_STATE)fun isAvailable(context: Context): Boolean {val info = getActiveNetworkInfo(context)return info != null && info.isAvailable}@JvmStatic@RequiresPermission(Manifest.permission.ACCESS_NETWORK_STATE)fun isConnected(context: Context): Boolean {val info = getActiveNetworkInfo(context)return info != null && info.isConnected}@JvmStaticfun ping(): Boolean {var result: String? = nulltry {val ip = "www.baidu.com" val p = Runtime.getRuntime().exec("ping -c 3 -w 100 $ip") val input = p.inputStreamval `in` = BufferedReader(InputStreamReader(input))val stringBuffer = StringBuffer()var content: String? = ""while (`in`.readLine().also { content = it } != null) {stringBuffer.append(content)}Log.e("TAG", "result content : $stringBuffer");val status = p.waitFor()if (status == 0) {result = "success"return true} else {result = "failed"}} catch (e: IOException) {result = "IOException"} catch (e: InterruptedException) {result = "InterruptedException"} finally {Log.e("TAG", "result = $result");}return false}@JvmStaticfun ping(ip: String): Boolean {var result: String? = nulltry {val p = Runtime.getRuntime().exec("ping -c 3 -w 100 $ip")val input = p.inputStreamval `in` = BufferedReader(InputStreamReader(input))val stringBuffer = StringBuffer()var content: String? = ""while (`in`.readLine().also { content = it } != null) {stringBuffer.append(content)}Log.e("TAG", "result content : $stringBuffer");val status = p.waitFor()if (status == 0) {result = "success"return true} else {result = "failed"}} catch (e: IOException) {result = "IOException"} catch (e: InterruptedException) {result = "InterruptedException"} finally {Log.e("TAG", "result = $result");}return false}@JvmStatic@RequiresPermission(Manifest.permission.ACCESS_WIFI_STATE)fun isWifiEnabled(context: Context): Boolean {val wifiManager =context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManagerreturn wifiManager.isWifiEnabled}@JvmStaticfun isWifi(context: Context): Boolean {val networkINfo = getActiveNetworkInfo(context)return networkINfo != null && networkINfo.type == ConnectivityManager.TYPE_WIFI}@JvmStatic@RequiresPermission(Manifest.permission.ACCESS_NETWORK_STATE)fun isWifiConnected(context: Context): Boolean {val connectivityManager =context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManagerreturn connectivityManager.activeNetworkInfo != null && connectivityManager.activeNetworkInfo!!.type == ConnectivityManager.TYPE_WIFI}@JvmStatic@RequiresPermission(Manifest.permission.ACCESS_NETWORK_STATE)fun is4G(context: Context): Boolean {val info = getActiveNetworkInfo(context)return info != null && info.isAvailable && info.subtype == TelephonyManager.NETWORK_TYPE_LTE}@JvmStatic@RequiresPermission(Manifest.permission.ACCESS_NETWORK_STATE)fun is5G(context: Context): Boolean {val info = getActiveNetworkInfo(context)return (info != null && info.isAvailable && info.subtype == TelephonyManager.NETWORK_TYPE_NR)}@JvmStaticfun isGpsEnabled(context: Context): Boolean {val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManagerval accessibleProviders = locationManager.getProviders(true)return accessibleProviders.size > 0}@JvmStaticfun openWirelessSettings(context: Context) {
context.startActivity(Intent(Settings.ACTION_WIFI_SETTINGS)) }private fun getActiveNetworkInfo(context: Context): NetworkInfo? {val connectivityManager =context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManagerreturn connectivityManager.activeNetworkInfo}@JvmStaticfun getNetworkOperatorName(context: Context): String? {val telephonyManager =context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManagerreturn telephonyManager.networkOperatorName}@JvmStaticfun getPhoneType(context: Context): Int {val telephonyManager =context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManagerreturn telephonyManager.phoneType}
}
object NetworkHelper {private var currentNetworkType: Int = -1private val mListeners = hashSetOf<OnNetworkStateChangedListener>()fun registerListener(context: Context, listener: OnNetworkStateChangedListener) {val preSize = mListeners.sizemListeners.add(listener)if (preSize == 0 && mListeners.size == 1) {val mFilter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)context.registerReceiver(NetworkStateChangedReceiver, mFilter)}}fun isRegistered(listener: OnNetworkStateChangedListener): Boolean {return mListeners.contains(listener)}fun unregisterListener(context: Context, listener: OnNetworkStateChangedListener) {val preSize = mListeners.sizemListeners.remove(listener)if (preSize == 1 && mListeners.size == 0) {context.unregisterReceiver(NetworkStateChangedReceiver)}}object NetworkStateChangedReceiver : BroadcastReceiver() {override fun onReceive(context: Context, intent: Intent) {if (ConnectivityManager.CONNECTIVITY_ACTION == intent.action) {val netWorkType = NetworkUtils.getNetWorkType(context)if (currentNetworkType == netWorkType) {return}currentNetworkType = netWorkTypeif (netWorkType == NetworkUtils.NETWORK_NONE) {for (listener in mListeners) {listener.onDisconnected()}} else {for (listener in mListeners) {listener.onConnected(currentNetworkType)}}}}}interface OnNetworkStateChangedListener {fun onDisconnected()fun onConnected(networkType: Int)}
}
使用
NetworkHelper.registerListener(mContext, this)NetworkHelper.unregisterListener(mContext, this)
override fun onDisconnected() {Log.e(NETWORK, "当前无网络连接")tvNetwork.text = "当前无网络连接"
}override fun onConnected(networkType: Int) {when (networkType) {NetworkUtils.NETWORK_WIFI -> {Log.e(NETWORK, "切换到wifi环境下")tvNetwork.text = "切换到wifi环境下"}NetworkUtils.NETWORK_2G -> {Log.e(NETWORK, "切换到2G环境下")tvNetwork.text = "切换到2G环境下"}NetworkUtils.NETWORK_3G -> {Log.e(NETWORK, "切换到3G环境下")tvNetwork.text = "切换到3G环境下"}NetworkUtils.NETWORK_4G -> {Log.e(NETWORK, "切换到4G环境下")tvNetwork.text = "切换到4G环境下"}NetworkUtils.NETWORK_5G -> {Log.e(NETWORK, "切换到5G环境下")tvNetwork.text = "切换到5G环境下"}NetworkUtils.NETWORK_UNKNOWN -> {Log.e(NETWORK, "未知网络")tvNetwork.text = "未知网络"}}
}