【问题标题】:Check Internet is Connected on Device or not when wifi is enable启用wifi时检查设备是否已连接互联网
【发布时间】:2016-06-01 10:03:39
【问题描述】:

我遇到了有关设备是否在互联网上可用的问题。让我用一个例子简要解释一下我的查询: 我已经用一个用例测试了我的应用程序,即我在我的路由器 wifi 上,但我从路由器上拔下以太网电缆并使用以下代码在 wifi 上连接我的设备:

private boolean checkConnection() {
    boolean connected = false;
    ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

    if (cm != null) {
        NetworkInfo[] netInfo = cm.getAllNetworkInfo();

        for (NetworkInfo ni : netInfo) {
            if ((ni.getTypeName().equalsIgnoreCase("WIFI")
                || ni.getTypeName().equalsIgnoreCase("MOBILE"))
                & ni.isConnected() & ni.isAvailable()) {
                connected = true;
            }

        }
    }

    return connected;
}

我会得到一个连接的布尔标志。这个代码返回交换机的设备状态意味着我的设备是否连接到 WiFi 但我不会从服务器或主机得到任何响应,所以我需要检查互联网的可行性是否在我的设备上。请有人帮助我。我尝试了许多护目镜方法或方法,但都失败了。

提前致谢。

【问题讨论】:

  • 你想测试工作网络吗?
  • 是的,我只是想测试一下设备上的网络是否可用。
  • stackoverflow.com/questions/4238921/… 看看接受的答案@mohd Ahsa
  • @jhaman Das 你在这里看到我的问题了吗?

标签: android class android-studio


【解决方案1】:

如果您需要检查连接是否真的提供互联网,您可以尝试 ping 一些远程主机 - google,例如:How to Ping External IP from Java Android

【讨论】:

  • 感谢您的回复,但当我用我的用例测试此代码时,它不适合我的需要,它也失败了。
  • 我的用例是 wifi 路由器未连接到互联网,但我的设备已连接到路由器并显示我的设备已连接到设备 wifi,并且它也需要很长时间,例如 30 -40其次是通过异常未知主机及其对用户体验非常不利我只想在 3-4 秒内获得解决方案,您对此有什么建议
  • 使用改造或 loopj 库,他们已经处理了当您无法从连接中获取数据流量时您会收到错误代码的所有事情。
  • @MohdAhsan - 如果您没有互联网连接,但物理连接到路由器(实际上是属于 ISO/OSI 模型网络层的设备),您可以尝试 ping 路由器。
  • @MohdAhsan 是的,如果名称解析失败,可能需要很长时间。要跳过它,您可以 ping IP 地址,而不是域名。例如,尝试 ping google 的 ip 8.8.8.8 - 它应该需要几秒钟才能完成,正如您所愿。
【解决方案2】:
      On button click 
        if(isInternetON(MainActivity.this)){
        mMyDownloadTask = new MyDownloadTask();
        delayCancel = new DelayCancel(mMyDownloadTask);
        handler.postDelayed(delayCancel,3*1000);
        mMyDownloadTask.execute();



        }



  public static class MyDownloadTask extends AsyncTask<Boolean,Void,Boolean> {

        public MyDownloadTask() {

        }

        protected Boolean doInBackground(Boolean... params) {
            try {
                URL url = new URL("http://www.google.com");
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//              connection.setRequestMethod("Head");
//              connection.setConnectTimeout(2000);
                connection.connect();

                int code = connection.getResponseCode();
                Log.e(TAG, "code : " + code);
                if (code == 200) {
                    ThreadActivity.isAviliable = true;
                    MainActivity.value = "true";
                    return true;

                } else {
                    ThreadActivity.isAviliable = false;
                    MainActivity.value = "false";
                    return false;

                }

            } catch (Exception e) {
                ThreadActivity.isAviliable = false;
                MainActivity.value = "false";
                e.printStackTrace();
                return false;
            }

        }

        protected void onPostExecute(Boolean result) {
            // dismiss progress dialog and update ui
            Log.e(TAG,"result "+result);
            if(result){
                ThreadActivity.isAviliable = true;
                MainActivity.value = "true";
            }else{
                ThreadActivity.isAviliable = false;
                MainActivity.value = "false";
            }

        }
    }
    public static class DelayCancel implements Runnable{
        private AsyncTask task;

        public DelayCancel(AsyncTask task) {
            this.task = task;

        }

        @Override
        public void run() {
            Log.e(TAG, "Running.....");
            if (task.getStatus() == AsyncTask.Status.RUNNING) {
                task.cancel(true);
                Log.e(TAG, "Cancel 1.....");
                ThreadActivity.isAviliable = false;
                MainActivity.value = "false";
            }
            if (task.getStatus() == AsyncTask.Status.PENDING){
                task.cancel(true);
                ThreadActivity.isAviliable = false;
                MainActivity.value = "false";
                Log.e(TAG, "Cancel 2.....");
            }
        }
    }

    public static boolean isInternetON(Context ctx){

        ConnectivityManager cm =(ConnectivityManager)ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();

       /* Log.e("Common Class","activeNetwork.getState()"+activeNetwork.getState());
        Log.e("Common Class","activeNetwork.isAvailable()"+activeNetwork.isAvailable());
        Log.e("Common Class","activeNetwork.getReason()"+activeNetwork.getReason());
        Log.e("Common Class","activeNetwork.getExtraInfo()"+activeNetwork.getExtraInfo());
        Log.e("Common Class","activeNetwork.describeContents()"+activeNetwork.describeContents());
        Log.e("Common Class","activeNetwork.isConnectedOrConnecting()"+activeNetwork.isConnectedOrConnecting());
        Log.e("Common Class","activeNetwork.isFailover()"+activeNetwork.isFailover());*/

        boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting() && activeNetwork.isAvailable();

        return isConnected;
    }

【讨论】:

  • 这是我的问题的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 2023-03-30
  • 2023-03-19
  • 1970-01-01
  • 2021-10-30
  • 2018-02-02
相关资源
最近更新 更多