检查手机是不是使用 WIFI 或 Data/3G

Posted

技术标签:

【中文标题】检查手机是不是使用 WIFI 或 Data/3G【英文标题】:Check whether mobile is using WIFI or Data/3G检查手机是否使用 WIFI 或 Data/3G 【发布时间】:2013-06-13 10:58:20 【问题描述】:

假设设备上同时启用了 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();

【问题讨论】:

看看这个 (***.com/a/11343250/833647) @KenWolf 非常好的链接 android : Check 3G or Wifi network is ON or Available or not on android Device的可能重复 如果您得到了答复,请批准? 【参考方案1】:
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();
    

【讨论】:

这是什么投反对票,请发表评论,这样我就可以在我知道我非常正确的情况下解决我的答案 如果已经回答,请链接到问题而不是抄袭答案。答案当然是正确的——毕竟是你抄袭的。但是,这只会在 SO 上创建重复项,从而降低 SO 的整体可用性。 你的答案是错误的。 isAvailable() 告知是否可以通过 wifi 或移动设备进行网络连接,但不告知是否存在实际连接。您必须检查 isConnectedOrConnecting() 或仅检查 isConnected()。 感谢您指出这一点,我会更新我的答案,但我相信它解决了 ARMAGEDDON 的问题。 此解决方案已弃用,请参阅***.com/questions/32547006/… 了解新解决方案【参考方案2】:

您可以使用以下方法每次检查网络状态:

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

【讨论】:

【参考方案3】:
 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
        
    

【讨论】:

这个是检查网络是否连接,它不会告诉你是否连接了wifi或移动数据【参考方案4】:

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;

【讨论】:

在您的代码中,wifi 和移动对象具有相同的值。 这是如何获得 3 票的?您正在从同一个 NetworkInfo 对象返回一个值。

以上是关于检查手机是不是使用 WIFI 或 Data/3G的主要内容,如果未能解决你的问题,请参考以下文章

腾讯手机管家是如何检测连接的WIFI是不是安全的?

iPhone 是不是需要互联网或手机连接才能使用 Skyhook 通过 wifi 定位?

手机连接WiFi总是自动断开怎么办?

连接wifi后十几秒后自动断开?

苹果手机微信一开小程序就断wifi要怎么破?

为啥wifi显示正在连接马上又断开?