Android技术知识Android开发程序员

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

2018-08-20  本文已影响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;

}

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


代码视觉
上一篇下一篇

猜你喜欢

热点阅读