如何知道设备是不是有数据连接?

Posted

技术标签:

【中文标题】如何知道设备是不是有数据连接?【英文标题】:How to know whether device has data connection?如何知道设备是否有数据连接? 【发布时间】:2012-12-01 18:13:21 【问题描述】:

我正在尝试检测设备是否具有 wifi 或 3g 连接。如果它有连接,它将显示MapView,但是当两者都没有连接时,我的条件语句出现问题。

以下是我检查网络连接的方法:

private boolean haveNetworkConnection() 
    boolean haveConnectedWifi = false;
    boolean haveConnectedMobile = false;

    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo[] netInfo = cm.getAllNetworkInfo();
    for (NetworkInfo ni : netInfo) 
        if (ni.getTypeName().equalsIgnoreCase("WIFI"))
            if (ni.isConnected())
                haveConnectedWifi = true;
        if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
            if (ni.isConnected())
                haveConnectedMobile = true;
    
    return haveConnectedWifi || haveConnectedMobile;

这是我调用该方法的代码。可以上网时显示MapView,不上网时不显示toast。

if (haveNetworkConnection()) 
    if (loc != null && !loc.equals("")) 
        new GeocoderTask().execute(loc);
     else 
        Toast.makeText(this, "Internet Connection is Required to view this map", Toast.LENGTH_LONG).show();
    

【问题讨论】:

【参考方案1】:

假设您的循环返回正确的值,让我们取出本地布尔值,因为它们是不必要的:

private boolean haveNetworkConnection() 
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo[] netInfo = cm.getAllNetworkInfo();
    for (NetworkInfo ni : netInfo) 
        if (ni.getTypeName().equalsIgnoreCase("WIFI") && ni.isConnected())
            return true;
        if (ni.getTypeName().equalsIgnoreCase("MOBILE") && ni.isConnected())
            return true;
    
    return false;


如果循环不正确,您可以在代码中合并the documentation's method:

private boolean haveNetworkConnection() 
    ConnectivityManager cm =
            (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    if(activeNetwork != null)
        return activeNetwork.isConnectedOrConnecting();
    return false;

【讨论】:

【参考方案2】:

试试这个来检查互联网连接是否可用:

private boolean isNetworkAvailable() 
    ConnectivityManager connectivityManager 
        = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();

    return activeNetworkInfo != null;

【讨论】:

【参考方案3】:
private boolean haveNetworkConnection() 
    //boolean haveConnectedWifi = false;
    //boolean haveConnectedMobile = false;

    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo[] netInfo = cm.getAllNetworkInfo();
    for (NetworkInfo ni : netInfo) 
        if (ni.getTypeName().equalsIgnoreCase("WIFI"))
            if (ni.isConnected())
                return true;
        if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
            if (ni.isConnected())
                return true;
    
    return false;

【讨论】:

【参考方案4】:

你的逻辑是错误的:

if (haveNetworkConnection()) 
        if (loc != null && !loc.equals("")) 
            new GeocoderTask().execute(loc);
         else 
            Toast.makeText(this, "Internet Connection is Required to view this map", Toast.LENGTH_LONG).show();
        
    

如果 haveNetworkConnection () 为 false,您将永远无法到达 Toast。您应该按如下方式更改它:

if (haveNetworkConnection()) 
            if (loc != null && !loc.equals("")) 
                new GeocoderTask().execute(loc);
             
        
else 
                Toast.makeText(this, "Internet Connection is Required to view this map", Toast.LENGTH_LONG).show();
            

【讨论】:

以上是关于如何知道设备是不是有数据连接?的主要内容,如果未能解决你的问题,请参考以下文章

BLE 设备在不扫描时是不是会读取广告数据包? (自动连接)

JAVA建立连接后如何检查数据库是不是存在

如何获取IP地址打开球形相机设备并检查是不是连接?

如何将数据传输到连接的蓝牙LE设备

BLE 连接设备与交换数据问题

如何确定 Wi-Fi 是不是有互联网连接