【问题标题】:ConnectivityManager.CONNECTIVITY_ACTION get network disconected from in API >= 14?ConnectivityManager.CONNECTIVITY_ACTION 在 API >= 14 中断开网络连接?
【发布时间】:2012-11-08 16:26:02
【问题描述】:

我需要获取断开设备连接的网络。

现在我使用:

NetworkInfo ni =intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);

然后检查:

ni.isConnected()

如果返回 false ni - 是设备断开连接的网络。

ConnectivityManager.EXTRA_NETWORK_INFO 在 API 14 中已弃用。Google 表示使用 getActiveNetworkInfo() 获取网络信息。但是 getActiveNetworkInfo() 总是返回设备现在连接的网络(isConnected() 必须返回 true)!

如何在不使用 ConnectivityManager.EXTRA_NETWORK_INFO 的情况下获取设备断开连接的网络的网络信息?

Sertorio Noronha,当我使用 getActiveNetworkInfo() 时,我只能得到我现在连接的网络!但我需要获取断开连接的网络。

ConnectivityManager cm = (ConnectivityManager)
    context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo n1 = cm.getActiveNetworkInfo();
Log.d("tets", String.format("%s: %s", n1.getTypeName(), n1.isConnected()));

当我从 WI-FI 断开连接并在日志中连接到 3G 时:

mobile: true
mobile: true

当我断开 3G 连接并在日志中连接到 WI-FI 时:

WIFI: true
WIFI: true
WIFI: true

getActiveNetworkInfo 仅返回现在连接的网络,但不返回我断开连接的网络。

如果我在日志中使用已弃用的 intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO),我会看到:

当我断开 WI-FI 并连接到 3G 时:

WIFI: false
mobile: true

当我断开 3G 并连接到 WI-FI 时:

mobile: false
WIFI: true

但我不想使用已弃用的 api。如何使用现代 api 获取我断开连接的网络?

【问题讨论】:

    标签: android networking connectivity


    【解决方案1】:

    你可以使用下面的

    ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    int networkType = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_TYPE);
    boolean isWiFi = networkType == ConnectivityManager.TYPE_WIFI;
    boolean isMobile = networkType == ConnectivityManager.TYPE_MOBILE;
    NetworkInfo networkInfo = connectivityManager.getNetworkInfo(networkType);
    boolean isConnected = networkInfo.isConnected();
    
    if (isWiFi) {
        if (isConnected) {
            Log.i("APP_TAG", "Wi-Fi - CONNECTED");
        } else {
            Log.i("APP_TAG", "Wi-Fi - DISCONNECTED");
        }
    } else if (isMobile) {
        if (isConnected) {
            Log.i("APP_TAG", "Mobile - CONNECTED");
        } else {
            Log.i("APP_TAG", "Mobile - DISCONNECTED");
        }
    } else {
        if (isConnected) {
            Log.i("APP_TAG", networkInfo.getTypeName() + " - CONNECTED");
        } else {
            Log.i("APP_TAG", networkInfo.getTypeName() + " - DISCONNECTED");
        }
    }
    

    【讨论】:

    • 对 EXTRA_NETWORK_TYPE 使用 extras.getInt 这个字段也是在 API 17 中引入的
    【解决方案2】:

    可以通过Context获取NetworkInfo的实例。

    ConnectivityManager connectivityManager = ((ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE));
    NetworkInfo currentNetworkInfo = connectivityManager.getActiveNetworkInfo();
    
    if(currentNetworkInfo != null && currentNetworkInfo.isConnected()){
       // Your logic goes in here
    }
    

    【讨论】:

    • 请使用 NetworkInfo 类中的 getTypeName()。 developer.android.com/reference/android/net/NetworkInfo.html
    • 您的回复没有回答我的问题!查看主题标题,我提供了其他信息。
    • 一个非常简单的解决方案是将先前的值存储在本地字符串中。你的问题可以用简单的逻辑来解决。
    • 这是我的解决方案,因为我也需要 api 级别 14-16
    【解决方案3】:

    工作的非弃用代码

    /**Receiver*/   
    
     public class NetworkStateReceiver extends BroadcastReceiver {
    
            /*
             * @see android.content.BroadcastReceiver#onReceive(android.content.Context,
             * android.content.Intent)
             */
            @Override
            public void onReceive(Context context, Intent intent) {
                ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
                int networkType = intent.getExtras().getInt(ConnectivityManager.EXTRA_NETWORK_TYPE);
                boolean isWiFi = networkType == ConnectivityManager.TYPE_WIFI;
                boolean isMobile = networkType == ConnectivityManager.TYPE_MOBILE;
                NetworkInfo networkInfo = connectivityManager.getNetworkInfo(networkType);
                boolean isConnected = networkInfo.isConnected();
    
                if (isWiFi) {
                    if (isConnected) {
                        Log.i("APP_TAG", "Wi-Fi - CONNECTED");
                    } else {
                        Log.i("APP_TAG", "Wi-Fi - DISCONNECTED");
                    }
                } else if (isMobile) {
                    if (isConnected) {
                        Log.i("APP_TAG", "Mobile - CONNECTED");
                    } else {
                        Log.i("APP_TAG", "Mobile - DISCONNECTED");
                    }
                } else {
                    if (isConnected) {
                        Log.i("APP_TAG", networkInfo.getTypeName() + " - CONNECTED");
                    } else {
                        Log.i("APP_TAG", networkInfo.getTypeName() + " - DISCONNECTED");
                    }
                }
            }
    
        }
    

    在清单中

    <!-- Receiver registration in manifest -->
         <receiver android:name="com.xxx.yyy.NetworkStateReceiver" >
                    <intent-filter>
                        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                    </intent-filter>
                </receiver>
    

    <!-- Internet permission for network comunication -->
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    

    【讨论】:

    • android.net.conn.CONNECTIVITY_CHANGE 在 Android N 中已弃用 - 仅供参考
    • 感谢您的评论,这是很久以前写的,很快就会根据新的 Android N 更新
    • @behelit 我认为 CONNECTIVITY_ACTION 在 Android N 中已被弃用? developer.android.com/preview/behavior-changes.html
    • 它没有被弃用,它只会触发前台和监听的应用程序。如果您的应用注册了此事件并且已停止或处于后台,则不会收到通知。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多