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

在我们连接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;

}

为了主动获取这种状态而不需要手动调用方法去查询,可以通过接受如下的广播:
WifiManager.NETWORK_STATE_CHANGED_ACTION。在这个广播中加上上面代码的判断就可以实时的获取状态的更新情况。

题外话,如果密码错误的话可以通过如下广播实现。

  if (action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) {
        int wifiPwdErrorResult = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, 1234);
        if (wifiPwdErrorResult == WifiManager.ERROR_AUTHENTICATING) {
            //密码错误
        }

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


Android应用获取wifi“已连接,但无法访问互联网”状态_第1张图片
代码视觉

你可能感兴趣的:(Android应用获取wifi“已连接,但无法访问互联网”状态)