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 = - 1 const val NETWORK_WIFI = 1 const val NETWORK_2G = 2 const val NETWORK_3G = 3 const val NETWORK_4G = 4 const val NETWORK_5G = 5 const 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} } @JvmStatic fun 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" } } @JvmStatic fun 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} @JvmStatic fun ping ( ) : Boolean { var result: String? = null try { 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 } @JvmStatic fun ping ( ip: String) : Boolean { var result: String? = null try { 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} @JvmStatic fun 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) } @JvmStatic fun isGpsEnabled ( context: Context) : Boolean { val locationManager = context. getSystemService ( Context. LOCATION_SERVICE) as LocationManagerval accessibleProviders = locationManager. getProviders ( true ) return accessibleProviders. size > 0 } @JvmStatic fun 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} @JvmStatic fun getNetworkOperatorName ( context: Context) : String? { val telephonyManager = context. getSystemService ( Context. TELEPHONY_SERVICE) as TelephonyManagerreturn telephonyManager. networkOperatorName} @JvmStatic fun getPhoneType ( context: Context) : Int { val telephonyManager = context. getSystemService ( Context. TELEPHONY_SERVICE) as TelephonyManagerreturn telephonyManager. phoneType}
}
object NetworkHelper { private var currentNetworkType: Int = - 1 private 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 = "未知网络" } }
}