android应用中的确认网络状态的方法

2,987 阅读1分钟

在应用中会有需要实现确认当前网络状态是否可用的功能。 这里所说的网络状态可用指的是wifi或者蜂窝网络中有一个是可用的。 本身代码不是很难,但是因为版本的问题需要加上版本的判断。

直接上代码。

private fun checkNetworkState(context: Context): Boolean {
        // 获取网络连接管理器
        val connectivityManager =
            context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        // 需要判断版本
        // 如果当前版本大于安卓6棉花糖
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // 通过网络连接管理器获得活跃网络
            val network = connectivityManager.activeNetwork ?: return false
            val activeNetwork = connectivityManager.getNetworkCapabilities(network) ?: return false
            return when {
 // 是否有wifi网络
activeNetwork.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> {
                    true
                }
 // 是否有蜂窝网络
 activeNetwork.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> {
                    true
                }
                else -> {
                    false
                }
            }
        } else {
           // 小于安卓6棉花糖
           // 其实框架并没有强行限制版本要求,只是下面的api已经被废弃,防止框架彻底移除该api而引起的崩溃,进行版本判断
           // 通过网络连接管理器获得当前活跃的网络信息
            val nwInfo = connectivityManager.activeNetworkInfo ?: return false
            // 返回当前是否有网络连接
            return nwInfo.isConnected
        }
    }

在API29中废弃了activeNetworkInfo的API,但同时引入了NetworkCallback。 通过该API可以进行网络的实时监听, 但是有一个不足点是只有APP启动时才能进行监听回调, 如果想在不启动状态下进行监听,只能使用Broadcast。

代码如下: (该代码来自:www.jianshu.com/p/66afbd05c…

  1. 设置callback
@Override
public void onAvailable(Network network) {
    super.onAvailable(network);
    Log.d(TAG, "onAvailable: 网络已连接");
}

@Override
public void onLost(Network network) {
    super.onLost(network);
    Log.e(TAG, "onLost: 网络已断开");
}

@Override
public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
    super.onCapabilitiesChanged(network, networkCapabilities);
    if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
        if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
            Log.d(TAG, "onCapabilitiesChanged: 网络类型为wifi");
            post(NetType.WIFI);
        } else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
            Log.d(TAG, "onCapabilitiesChanged: 蜂窝网络");
            post(NetType.CMWAP);
        } else {
            Log.d(TAG, "onCapabilitiesChanged: 其他网络");
            post(NetType.AUTO);
        }
    }
}
  1. 注册NetworkCallbackImpl
NetworkCallbackImpl networkCallback = new NetworkCallbackImpl();
NetworkRequest.Builder builder = new NetworkRequest.Builder();
NetworkRequest request = builder.build();
ConnectivityManager connMgr = (ConnectivityManager) NetworkListener.getInstance().getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (connMgr != null) {
    connMgr.registerNetworkCallback(request, networkCallback);
}