检查手机是否正在使用WIFI或数据/3G网络。

17

假设设备上同时启用了WIFI和Data/3G,我该如何检查用户当前是否正在使用WIFI或数据计划上的网络,假设两者都已启用。我不需要检查它们是否启用或禁用,我想检测用户实际上正在使用哪个。

我一直在尝试以下方法,这是唯一的解决方案吗?

WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
if (WifiInfo.getDetailedStateOf(wifiInfo.getSupplicantState()) == NetworkInfo.DetailedState.CONNECTED) {
    String ssid = wifiInfo.getSSID();
}

2
请查看此链接(https://dev59.com/B2gu5IYBdhLWcg3wZma8#11343250)。 - Ken Wolf
1
@KenWolf 非常好的链接。 - Aashish Bhatnagar
1
请您如果已经得到了答案,请点击“批准”吗? - Karue Benson Karue
4个回答

30
void chkStatus() {
    final ConnectivityManager connMgr = (ConnectivityManager)
    this.getSystemService(Context.CONNECTIVITY_SERVICE);
    final android.net.NetworkInfo wifi = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    final android.net.NetworkInfo mobile = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    if (wifi.isConnectedOrConnecting ()) {
        Toast.makeText(this, "Wifi", Toast.LENGTH_LONG).show();
    } else if (mobile.isConnectedOrConnecting ()) {
        Toast.makeText(this, "Mobile 3G ", Toast.LENGTH_LONG).show();
    } else {
        Toast.makeText(this, "No Network ", Toast.LENGTH_LONG).show();
    }
}

这个“downvote”是什么意思,请评论,以便我可以改进我的回答。据我所知,我的答案非常正确。 - Aashish Bhatnagar
4
如果问题已经有答案,请提供链接而不是抄袭答案。当然,答案是正确的——毕竟你复制了它。然而,这会在SO上创建重复内容,降低SO的整体可用性。 - 323go
1
你的答案是错误的。isAvailable() 方法可以告诉你是否可以通过 WiFi 或移动网络连接到网络,但它并不能告诉你是否实际上已经连接成功。你必须检查 isConnectedOrConnecting() 或者只检查 isConnected() 方法。 - Andranik
谢谢指出这点,我会更新我的答案,但我相信它解决了ARMAGEDDON的问题。 - Aashish Bhatnagar
2
此解决方案已经过时,请参见 https://dev59.com/NFwY5IYBdhLWcg3wgX-V 以获取新的解决方案。 - RoaflinSabos
显示剩余3条评论

6
您可以每次使用以下方法来检查网络状态:
public static String checkNetworkStatus(final Context context) {

        String networkStatus = "";

        // Get connect mangaer
        final ConnectivityManager connMgr = (ConnectivityManager)  
                context.getSystemService(Context.CONNECTIVITY_SERVICE);

        // check for wifi
        final android.net.NetworkInfo wifi = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

        // check for mobile data
        final android.net.NetworkInfo mobile = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

        if( wifi.isAvailable() ) {
            networkStatus = "wifi";
        } else if( mobile.isAvailable() ) {
            networkStatus = "mobileData";
        } else {
            networkStatus = "noNetwork";
        }

        return networkStatus;

}  // end checkNetworkStatus 

//vKj


0
 public boolean CheckConnectivity(final Context c) {
        ConnectivityManager mConnectivityManager = (ConnectivityManager) c.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (mConnectivityManager.getActiveNetworkInfo() != null
                && mConnectivityManager.getActiveNetworkInfo().isAvailable()
                && mConnectivityManager.getActiveNetworkInfo().isConnected()) {
            return true;
        } else {
            return false; // make it false
        }
    }

1
这是用来检查互联网是否连接的,它不会告诉你是否使用WiFi或移动数据连接。 - Manohar

0

getNetworkInfo是一个被弃用的方法。 我建议使用getActiveNetworkInfo

示例

private String checkNetworkStatus(Context context) {

    String networkStatus = "";
    final ConnectivityManager manager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

    if( manager.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI) {
        networkStatus = "wifi";
    } else if(manager.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_MOBILE){
        networkStatus = "mobileData";
    } else{
        networkStatus="noNetwork";
    }
    return networkStatus;
}

4
您的代码中wifi对象和mobile对象具有相同的值。 - Sina Rezaei
2
这怎么得到了3个赞?你正在从同一个“NetworkInfo”对象中返回一个值。 - ChumiestBucket
1
getActiveNetworkInfo现在已经弃用 - M Imam Pratama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接