android检测连接到的wifi网络是否有效

 /**
     * 判断当前网络是否可用(6.0以上版本)
     * 实时,快速
     * @return
     */
    public static boolean isNetSystemUsable() {
        boolean isNetUsable = false;
        ConnectivityManager manager = (ConnectivityManager)
                Utils.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            try {
                NetworkCapabilities networkCapabilities =
                        manager.getNetworkCapabilities(manager.getActiveNetwork());
                isNetUsable = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
                if (!isNetUsable) {
                    for (int i = 0; i < 3; i++) {
                        //WiFi初始连接到的瞬间,WiFi是不可用的,给过一段时间后才可用,故做循环延时判断
                        Thread.sleep(1000);
                        NetworkCapabilities networkCapability =
                                manager.getNetworkCapabilities(manager.getActiveNetwork());
                        isNetUsable = networkCapability.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
                        if (isNetUsable)
                            break;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
      
        return isNetUsable;
    }
/**
     * 此方法ping操作为非常耗时操作,必须在异步线程操作,否则容易出现ANR
     * android 6.0以下使用
     * @return
     */
    public static boolean isNetUseful() {
        int i;
        Runtime runtime = Runtime.getRuntime();
        Process exec = null;
        try {
            exec = runtime.exec("ping -c 1 -w 1 www.baidu.com");
            i = exec.waitFor();//无效网络的时候这里执行非常慢
            return i == 0;
        } catch(Exception e) {
            return false;
        }finally {
            //在结束的时候应该对资源进行回收
            if (exec != null) {
                exec.destroy();
            }
            runtime.gc();
        }
    }
public class NetPingHelper {

    private boolean netUseful = false;

    public void checkNetUseful(OnNetUsefulListener onNetUsefulListener) {
        onNetUsefulListener.onNetUseful();//因为检验网络有效性太耗时,若已经连接了网络,则先默认网络有效
        
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            new Thread() {
                @Override
                public void run() {
                    super.run();
                    if (!isNetSystemUsable())
                        onNetUsefulListener.onNetUnuseful();
                }
            }.start();
        } else {//6.0以下版本,ping
            new Thread() {
                @Override
                public void run() {
                    super.run();
                    if (isNetUseful()) {
                        NetPingHelper.this.netUseful = true;
                    }
                }
            }.start();
            new AppExecutors().schedule().schedule((Runnable) () -> {
                if (!NetPingHelper.this.netUseful) {
                    onNetUsefulListener.onNetUnuseful();
            
                }
            }, 6, TimeUnit.SECONDS);//ping6秒不通执行里面的代码
        }
    }

    public void checkNetUsefulWithoutDefault(OnNetUsefulListener onNetUsefulListener) {
    //若不需要默认在线状态,用这个方法
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            new Thread() {
                @Override
                public void run() {
                    super.run();
                    if (NetworkUtils.isNetSystemUsable())
                        onNetUsefulListener.onNetUseful();
                    else
                        onNetUsefulListener.onNetUnuseful();
                }
            }.start();
        } else {//6.0以下版本,ping
            new Thread() {
                @Override
                public void run() {
                    super.run();
                    if (NetworkUtils.isNetUseful()) {
                        NetPingHelper.this.netUseful = true; 
                    }
                }
            }.start();
            new AppExecutors().schedule().schedule((Runnable) () -> {
                if (!NetPingHelper.this.netUseful) {
                    onNetUsefulListener.onNetUnuseful();
                   
                } else {
                    onNetUsefulListener.onNetUseful();
                 
                }
            }, 6, TimeUnit.SECONDS); //延时6秒,6秒还没ping通则执行里面的代码
        }
    }


    public interface OnNetUsefulListener {
        void onNetUseful();
        void onNetUnuseful();
    }

}

//网络ping 的定时任务
public class NetPingTimerTask {

    private Timer timer = new Timer();

    private void timerCancel() {
        timer.cancel();
    }

    public void timerStart() {
        try {
            timer.schedule(timerTask, 2000, 6000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private TimerTask timerTask = new TimerTask() {
        @Override
        public void run() {
            new NetPingHelper().checkNetUsefulWithoutDefault(new NetPingHelper.OnNetUsefulListener() {
                @Override
                public void onNetUseful() {
                    timerCancel();
                   
                }

                @Override
                public void onNetUnuseful() {

                }
            });
        }
    };


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值