【问题标题】: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();
}

【问题讨论】:

标签: android


【解决方案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 的问题。
  • 此解决方案已弃用,请参阅stackoverflow.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 对象返回一个值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2023-04-05
    • 2011-05-29
    • 2013-11-28
    相关资源
    最近更新 更多