首页 > 代码库 > Android网络

Android网络

Android访问网络有很多种方式,比如WiFi,移动网络(3G等)...

他们是有一个优先级的。

  • 当WiFi连接,打开3G网络,3G网络将被自动屏蔽;
  • 当3G连接,连接WiFi,3G网络将被屏蔽,启用WiFi;
  • 当WiFi连接,然后关闭,如果3G网络可用,将自动切换到3G网络。

这是系统默认的,可以通过API来改变这种优先级。比如:当3G连接,连接WiFi,我们希望仍然使用3G网络,那么

ConnectivityManager connMgr = (ConnectivityManager)                getSystemService(Context.CONNECTIVITY_SERVICE);        
connMgr.setNetworkPreference(ConnectivityManager.TYPE_MOBILE);

当这样设置之后,会自动断开WiFi连接。

那通过代码,怎么知道WiFi是否连接或者移动网络是否连接呢?

    //判断是否有网络连接    public boolean isOnline() {        ConnectivityManager connMgr = (ConnectivityManager)                getSystemService(Context.CONNECTIVITY_SERVICE);        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();        //connMgr.setNetworkPreference(ConnectivityManager.TYPE_MOBILE);        return (networkInfo != null && networkInfo.isAvailable());    }    //判断WiFi是否连接    public boolean isWifiConnected() {        ConnectivityManager connMgr = (ConnectivityManager)                getSystemService(Context.CONNECTIVITY_SERVICE);        NetworkInfo networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);        return (networkInfo != null && networkInfo.isConnected());    }    //判断移动网络是否连接    public boolean isMobileConnected() {        ConnectivityManager connMgr = (ConnectivityManager)                getSystemService(Context.CONNECTIVITY_SERVICE);        NetworkInfo networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);        return (networkInfo != null && networkInfo.isConnected());    }

判断WiFi是否连接,还可以通过WifiManager

//判断WiFi是否连接    public boolean isWifiConnected() {        WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);        if (wifiManager.isWifiEnabled()) {            WifiInfo wifiInfo = wifiManager.getConnectionInfo();            return wifiInfo != null && SupplicantState.COMPLETED == wifiInfo.getSupplicantState();        }        return false;    }

它还提供了很多操控WiFi的方法,比如连接或断开WiFi连接,打开或关掉WiFi等。

有WiFi连接并不等于连接到Internet。比如:手机连接到无线路由器,而无线路由器没有连接Internet,这种情况可以用代码容易地判断

    //判断WiFi连接时是否能够访问Internet    public boolean hasWifiInternetAccess() {        WifiManager mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);        if(mWifiManager.isWifiEnabled()) {            return mWifiManager.pingSupplicant();        }        return false;    }

上面的方法其实并不能准确的判断当WiFi连接是是否可以访问Internet。例如,当连接到机场的WiFi,它需要打开浏览器,在弹出的页面上输入用户名密码,此时pingSupplicant返回的是TRUE,当这种情况时,只能通过代码访问某个网址,检查返回值来检测是否能够上网。