【问题标题】:How to get details about disconnected network?如何获取有关断开网络的详细信息?
【发布时间】:2019-12-29 10:22:35
【问题描述】:

有没有办法使用android广播接收器或networkcallback获取有关断开网络的详细信息?

EXTRA_NETWORK_INFO、getNetworkInfo(NetworkType) 已弃用。

getAllNetworks() 返回框架当前跟踪的所有网络的数组,但不包括断开连接的网络。

【问题讨论】:

  • 不,大多数 api 已被弃用,我发现唯一的使用方法是 NetworkCallback,onLost(Network network) 可用于检测丢失的网络。我认为 getNetworkInfo(Network network) 可用于获取有关丢失网络的详细信息,但在我的情况下它返回 null :(
  • NetworkInfo 已从 API 29 中弃用
  • 还有其他方法可以获取接口名称、接口状态等接口详细信息吗?

标签: android android-broadcast android-things android-things-console


【解决方案1】:

是的,首先像这样注册广播接收器:

final IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        context.registerReceiver(receiver, intentFilter);

当接收者是:

new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                // this part is trigered when there is some network changes, do checks here
            }
        };

别忘了注销它。

【讨论】:

  • 是的,我知道这一点,我想知道哪个网络断开连接,例如 WiFi 或移动数据等。
【解决方案2】:

是的。 NetworkInfo class 已从 API 级别 29 中弃用。相反,ConnectivityManager class 在这里会有所帮助。它有助于监控网络连接,并在网络连接发生变化或网络连接丢失时通知应用程序。它还允许应用程序了解可用网络的状态,并允许应用程序为其数据流量请求和选择网络。

但是,ConnectvityManager 类中不推荐使用以下方法列表:

getNetworkInfo 返回某个特定的连接状态 网络类型。
getAllNetworkInfo返回设备支持的所有网络类型的连接状态信息。 getActiveNetworkInfo 返回当前活动的默认数据网络 网络。

ConnectivityManager.NetworkCallback 目前可用于确定网络更改状态。 NetworkRequest 回调的这个基类用于有关网络更改的通知,可以由需要网络更改通知的应用程序扩展。

支持以下方法列表:

getAllNetworks 返回当前所有网络的数组 跟踪。
getActiveNetwork 返回一个网络对象 当前活动的默认数据网络。

NetworkCapabilities 类应有助于表示活动网络的能力。

一般情况下,每当系统调用onAvailable(Network)时,都会通过可用的网络,每当系统调用onLost(Network)时,都会通过传递丢失的网络,它指的是丢失(断开连接)的特定网络,参数告诉您哪个网络丢失(断开连接)。

onCapabilitiesChanged 在 onAvailable 之后立即被调用,这可以通过使用 hasTransport() 和适当的传输常量(如 TRANSPORT_CELLULAR 或 TRANSPORT_WIFI)查询 NetworkCapabilities 来帮助确定可用网络的功能,例如它是蜂窝网络还是 WiFi 网络(感兴趣的网络)。

下面的 sn-p 考虑了上述信息,并有助于确定您是否具有蜂窝或 wifi 网络连接,从而可以确认断开的网络(丢失)是否确实没有使用。

ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
    Network network = connectivityManager.getActiveNetwork();
    NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
    return capabilities != null && (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    相关资源
    最近更新 更多