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;
}
更多精彩文章,请关注公众号“代码视觉”。转载请联系授权!
代码视觉