Android网络检测的大坑

最近发现在Android平板上的 ConnectivityManager 为 null ,查了下资料大致内容如下:

Android 平板 以太网 网线重插后,程序里去取getActiveNetworkInfo会等于null,没有活动网络,从而无法检查isConnected和getTypeName取得网络类型等信息,但其实是可以上网的,用WebView控件或自带的google浏览器上网正常,只是用自带的浏览器上网时第一次浏览网页会出现没有网络连接的提示框,但网页本身已经打开,而且后面的浏览都很正常,就是程序里一直获取不到getActiveNetworkInfo,除非重启机器或在android的以太网设置里把以太网的勾先去掉再打上,重新这么折腾下程序里getActiveNetworkInfo又能取得活动网络信息了.

Android 原生系统是不支持以太网络的连接的,这肯定是厂商定制了的,但是对于厂家定制的代码一般的都有或多或少的BUG,基本上这是属于BUG的,接口提供的不好。这应该是实际EthernetManager连接上了的,EthernetService也可以了的,IPC通信上了的。但是在connectivityManager里面,或者ConnectivitySerive里面,并没有获得这个信息(没有通知他这个接口做出改变)。建议这个时候应该用EthernetManager(各个平台,有线网络的管理类可能名字叫法不一样).

/** 
     * 检测网络是否可用1 
     * @param act 
     * @return 
     */  
    public boolean isNetConnected(Activity act){  

            ConnectivityManager manager = (ConnectivityManager) act    
                   .getApplicationContext().getSystemService(    
                          Context.CONNECTIVITY_SERVICE);    

            if (manager == null) {    
                return false;  // 针对平板可以直接返回 ture ,哈哈。  
            }    
            NetworkInfo networkinfo = manager.getActiveNetworkInfo();    
            if (networkinfo == null || !networkinfo.isAvailable()) {    
                return false;    
            }    
            return true;    
    }  

/** 
     * 检测网络是否可用2 
     */  
private boolean isNetConnected() {  
        PppoeManager pppoeManager = PppoeManager.getInstance();  
        EthernetManager ethernetManager = EthernetManager.getInstance();  
        ConnectivityManager connectivityManager = (ConnectivityManager)  
     getSystemService(CONNECTIVITY_SERVICE);  
        NetworkInfo networkInfo = connectivityManager.getNetworkInfo  
    (ConnectivityManager.TYPE_WIFI);  
        if (networkInfo.isConnected() || ethernetManager.isNetworkConnected()  
                || pppoeManager.getPppoeStatus().equals  
        (PppoeManager.PPPOE_STATE_CONNECT)) {  
            return true;  
        } else {  
            return false;  
        }  
    } 

EthernetManager 属于Android 隐藏API ,调用的时候又很麻烦,而且出了新版本可能就不支持了,所以还是建议不要使用比较好。

梦想还是要有的,万一实现了呢?