Android 11以后关于网络监听处理
Android 11以后关于网络监听处理
随着权限和隐私的的进一步严格,网络监听也做了修改,以前获取网络状态的api已经标注为Deprecated,即以前通过广播监听方式已经标记废弃,因此来一起看看新的网络监听api以及监听逻辑;
/**
*Deprecated
apps should use the more versatile requestNetwork, registerNetworkCallback or registerDefaultNetworkCallback functions instead for faster and more detailed updates about the network changes they care about.
*/
@Deprecated
public static final String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
上面讲述了该api已经废弃,并推荐开发者使用新的api去处理。
NetworkCallback
新的网络监听主要通过向ConnectivityManager注册NetworkCallback网络变化,其可以监听可用网络,网络丢失,网络丢包情况,主要api如下:
- onAvailable(network: Network); //有可用网络情况调用;
- onLost(network: Network) ; //可用网络丢失
- onLosing(network: Network, maxMsToLive: Int) ; //丢包情况
其他的:
- onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities);//网络能力变化
- onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) //网络属性变化
简单的使用
val connectivityManager = getSystemService(ConnectivityManager::class.java)
connectivityManager.registerDefaultNetworkCallback(object :
ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
val networkCapabilities = connectivityManager.getNetworkCapabilities(network)
val properties = connectivityManager.getLinkProperties(network)
val preference = connectivityManager.getMultipathPreference(network)
Log.e(
TAG,
"The default network is now: $network capabilities:$networkCapabilities properties:$properties preference:$preference"
)
}
override fun onLost(network: Network) {
Log.e(
TAG,
"The application no longer has a default network. The last default network was $network"
)
}
override fun onLosing(network: Network, maxMsToLive: Int) {
super.onLosing(network, maxMsToLive)
}
override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) {
if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
val wifiInfo = networkCapabilities.transportInfo as WifiInfo
}
if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
}
Log.e(TAG, "The default network changed capabilities: $networkCapabilities")
}
override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) {
Log.e(TAG, "The default network changed link properties: $linkProperties")
}
})
上面代码监听所有网络变化情况,如果关注特定网络变化,可以通过NetworkRequest构建需要监听的网络:
val request = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build()
connectivityManager.registerNetworkCallback(
request,
object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
Log.e(TAG, "The default network is now: $network")
}
override fun onLost(network: Network) {
Log.e(
TAG,
"The application no longer has a default network. The last default network was $network"
)
}
override fun onCapabilitiesChanged(
network: Network,
networkCapabilities: NetworkCapabilities
) {
Log.e(TAG, "The default network changed capabilities: $networkCapabilities")
}
override fun onLinkPropertiesChanged(
network: Network,
linkProperties: LinkProperties
) {
Log.e(TAG, "The default network changed link properties: $linkProperties")
}
})
通过上面代码可以看到,在获得可用网络时,api给到的只有一个network实例,如果我们需要获取更具体信息,可以通过getNetworkCapabilities等api进一步了解具体详情:如网络能力、网络属性和偏好等。
如 val networkCapabilities = connectivityManager.getNetworkCapabilities(network),输出结果如下:
[ Transports: WIFI Capabilities: NOT_METERED&INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN&VALIDATED&NOT_ROAMING&FOREGROUND&NOT_CONGESTED&NOT_SUSPENDED&NOT_VCN_MANAGED LinkUpBandwidth>=12000Kbps LinkDnBandwidth>=60000Kbps TransportInfo: <SSID: <unknown ssid>, BSSID: 02:00:00:00:00:00, MAC: 02:00:00:00:00:00, IP: /10.1.206.45, Security type: 2, Supplicant state: COMPLETED, Wi-Fi standard: 5, RSSI: -51, Link speed: 234Mbps, Tx Link speed: 234Mbps, Max Supported Tx Link speed: 433Mbps, Rx Link speed: 263Mbps, Max Supported Rx Link speed: 433Mbps, Frequency: 5260MHz, Net ID: -1, Metered hint: false, score: 60, isUsable: true, CarrierMerged: false, SubscriptionId: -1, IsPrimary: -1, Trusted: true, Restricted: false, Ephemeral: false, OEM paid: false, OEM private: false, OSU AP: false, FQDN: <none>, Provider friendly name: <none>, Requesting package name: <none><none>MLO Information: , AP MLD Address: <none>, AP MLO Link Id: <none>, AP MLO Affiliated links: <none>> SignalStrength: -51 UnderlyingNetworks: Null]
描述似乎是关于设备的WiFi连接的技术详细信息,包括链接速度、信号强度和安全类型。这些信息可以用于诊断连接问题或确定其是否适合某些任务。一些关键点包括:
SSID(网络名称)未知。
BSSID(接入点的MAC地址)为02:00:00:00:00:00。
设备的IP地址为10.1.206.45。
安全类型为WPA2(2)。
信号强度为-64 dBm。
链接速度为234 Mbps,最大支持速度为433 Mbps。
它还提到该连接被认为是“可信”的、“不受限制的”且具有高带宽,表明它应该适用于大多数在线活动。
至于properties、preference我们可以看具体输出。
以上是关于网络变化的监听,如果我们仅仅只要当前的网络情况我们可以:
val currentNetwork = connectivityManager.activeNetwork
// 这里前期是currentNetwork 不为空,如果网络不可用为空;有网络的时候非空,才能继续下面步骤
val networkCapabilities = connectivityManager.getNetworkCapabilities(currentNetwork )
val properties = connectivityManager.getLinkProperties(currentNetwork )
val preference = connectivityManager.getMultipathPreference(currentNetwork )
if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
val wifiInfo = networkCapabilities.transportInfo as WifiInfo
}
if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
//
}
以上是获取当前可用网络,以及进一步判断当前网络信息等。