美文网首页Android技术知识Android开发程序员
Android应用获取wifi“已连接,但无法访问互联网”状态

Android应用获取wifi“已连接,但无法访问互联网”状态

作者: 代码视觉 | 来源:发表于2018-08-20 18:12 被阅读35次

    在我们连接wifi时经常会遇到已经连接wifi但是没法上网的情况,比如wifi已经连接路由器,但是路由器并没有插入网线等等都会出现这样的情况。

    那么在工作中如果需要在代码中判断这种状态时该怎么判断呢?

    首先你可能想到的是WifiManager或者广播,因为这是系统提供给上层的访问接口,但是遗憾的是对于这种状态WifiManager和广播都没有进行处理,所以你需要想办法看看系统层该怎么处理。

    思路:查看原生设置的代码,设置中“已连接,但无法访问互联网”是怎么显示的,在没有办法修改系统代码的前提下,你只需要将相应的代码抽离到你自己的app中就可以。

    具体的代码如下,自测ok。

    
    private boolean NetworkCapabilities(){
    
              ConnectivityManager cm = (ConnectivityManager)
    
              getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
    
              Network nw;
    
              try {
    
                     nw=getCurrentNetwork(getApplicationContext());
    
               }catch (Exception e) {
    
                     nw =null;
    
              }
    
              NetworkCapabilities nc = cm.getNetworkCapabilities(nw);
    
              //通过如下这个判断,可以达到预期的效果
    
             if (nc !=null && !nc.hasCapability(nc.NET_CAPABILITY_VALIDATED)) {
    
                    Log.d(LOG_TAG,"已连接,但无法上网");
    
                    return true;//已连接,但无法上网。
    
             }
    
             return false;
    
    }
    
    

    由于WifiManager中获取Network的方法是hide的,上层必然不能直接调用,故而通过反射拿到network。

    
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    
    private  Network getCurrentNetwork(Context context)
    
    {
    
           WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    
            Method method =null;
    
           Network network=null;
    
         try{
    
               method = wifiManager.getClass().getMethod("getCurrentNetwork");
    
         }catch (NoSuchMethodException e){
    
             e.printStackTrace();
    
        }
    
       try{
    
            network = (Network) method.invoke(wifiManager);
    
        }catch (IllegalAccessException e){
    
             e.printStackTrace();
    
        }catch (InvocationTargetException e){
    
           e.printStackTrace();
    
        }
    
         return network;
    
    }
    
    

    更多精彩文章,请关注公众号“代码视觉”。转载请联系授权!


    代码视觉

    相关文章

      网友评论

        本文标题:Android应用获取wifi“已连接,但无法访问互联网”状态

        本文链接:https://www.haomeiwen.com/subject/eqoliftx.html