【问题标题】:Deal with inactive wi-fi networks处理不活跃的无线网络
【发布时间】:2012-08-10 11:12:49
【问题描述】:

假设手机找到开放的 wi-fi 网络并连接到它。但是 wi-fi 网络处于“非活动状态”,即当您打开浏览器时,您会看到输入凭据的提示。我的手机上有很多应用程序(例如网络浏览器),在这种情况下无法正常工作。 我想使用移动网络发送数据,但系统仍然尝试使用 wi-fi。

NetworkInfo.isAvailable()NetworkInfo.isConnected() 仍会为描述的 wi-fi 网络返回 true。 有什么解决办法吗?

【问题讨论】:

  • 是否可以简单地 ping 像谷歌这样的网站?如果接入点后面有一个登录页面,这将在通常会成功的地方失败。
  • 这类似于stackoverflow.com/a/1085054/193892,但对于 Android 来说是 Windows。如果它存在就好了。

标签: android


【解决方案1】:

我也遇到了同样的问题,通过Android SDK我发现没有这种可能,你必须自己写。

这取决于你想对网络做什么以及你所说的“非活动”是什么意思 - 你可以连接到一个没有连接到互联网的路由器,并且没有 Android 方法可以检查这种情况。正如 MrMichael 所写,ping 是检查它的一种方法,但在这种情况下,正面测试只会为您提供有关 ping 的信息 - 网络可能有一些允许您发送 ping 的重型防火墙,但我。 e.不会让 HTTP 请求通过。

在这种情况下,您必须根据自己的需要编写自己的自定义测试,唉——这就是我所做的。我刚刚实现了简单的类似 ping 的协议(我尝试在正确的 IP/端口上连接我的套接字并发送短消息等待简短的回答)。只有这样才能让我 100% 保证可以建立我想要的连接。

【讨论】:

  • "你可以连接到一个没有连接到互联网的路由器" - 完全正确
  • 所以如果路由器没有连接到互联网,那么method 会返回true?因为主机不同于url.getHost()?
【解决方案2】:

据我所知,没有办法强制通过 wifi 使用数据连接(也许在没有用户交互的情况下您不应该这样做)。

我的许多应用程序都有相同的要求,我想知道在加载初始屏幕时它们是否有可行的网络连接(例如,如果没有,我会显示应用程序的只读版本)。

我解决这个问题的方法是向我的服务器发起一个简单的服务调用,名为isAlive,它只会立即返回一个 true。这不仅告诉我我可以看到我的服务,它还确认我的服务器在线(我没有问题)。如果我没有及时得到回复,我会通知用户他们没有网络连接,并且“请在继续之前确保您有有效的数据/wifi 连接”。然后,我将isConnected 属性设置为 wifi 并将此消息修改为“您当前的无线连接无法访问互联网”或类似内容。

不是您希望的答案,但也许有可能?

【讨论】:

  • 如何检查服务器是否存活?简单的http请求?
  • 在我的情况下,它是对我的 web 服务的调用,它被硬编码为回复 TRUE。这样,如果我不能点击服务,我就知道它是错误的。但是你可以只使用一个 http 请求,如果你得到一个异常假定为 false。
【解决方案3】:

只是一个建议:您可以尝试使用requestRouteToHost()。不过先搜一下SO使用这个方法的问题。

您还需要CHANGE_NETWORK_STATE 权限。

【讨论】:

    【解决方案4】:

    试试这个....

    我需要做一些定制的工作..但是让它运行起来......

    我的代码switches from Wifi to Mobile network关闭时。

    我正在使用TimeService at port 37 知道互联网已死,而 wifi 连接仍处于打开状态

    //////////////////////已编辑/////////////// ///////////////

    现在我将我制作的complete working code 放在这里。请原谅我,DRY(不要重复自己的原则)在这里被滥用了。所以在生产网络中使用时请重构代码并将重复的代码转换为方法,即转换为single sensible place

    /////---------------------------Intial Available Network Checking
    
    
    
    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;
    

    } /////----------------------------初始可用网络检查

    /////-------------------------------Check for the working Internet Connection
    
    
    public boolean inetAddr(){
    
        boolean x1 = false;
    
    
        try {
            Socket s = new Socket("utcnist.colorado.edu", 37);
    
            InputStream i = s.getInputStream();
    
            Scanner scan = new Scanner(i);
    
            while(scan.hasNextLine()){
    
                System.out.println(scan.nextLine());
                x1 = true;
            }
        } catch (Exception e) {
    
    
                x1 = false;
        } 
    
        return x1;
    
    }
    
    /////-------------------------------Check for the working Internet Connection
    
    
    ////-------------------------------Check Mobile Conectivity Again
    
    public boolean mobileConnect(){
    
        boolean conn = false;
        ConnectivityManager cm =  (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNet = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    
        if(activeNet != null){
    
            conn = true;
        }else{
    
            conn = false;
        }
    
        return conn;
    
    
    
    }
    
    ////------------------------------Check Mobile Conectivity Again
    

    这里我使用的是上述方法....

    try{    
         if (!checkConnection()){
    
    
             AlertDialog.Builder myAlertDialog = new AlertDialog.Builder(YumZingSplashActivity.this);
             myAlertDialog.setTitle("--- Connectivity Check ---");
             myAlertDialog.setMessage("No Internet Connectivity");
             myAlertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
    
              public void onClick(DialogInterface arg0, int arg1) {
    
                YumZingSplashActivity.this.finish();
                //splashHandler.removeCallbacks(launcherRunnable);
    
              }});
                System.out.println("No Internet Connectivity");
    
                myAlertDialog.show();           
    
    
    
    
            }
            else{
    
    
                  if(inetAddr()){
                aphandle = APIHandling.getInstance();
                aphandle.xmlCreateSession();
                System.out.println("Net Connectivity is Present");
                DURATION = Integer.valueOf(getString(R.string.splash_duration));
    
    
    
                splashHandler = new Handler();
    
                //  ================ Main Code of the Application
                launcherRunnable = new Runnable() {
    
                    public void run() {
                        Intent i = new Intent(YumZingSplashActivity.this, YumZingTabHostActivity.class);
                        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        startActivity(i);
                        YumZingSplashActivity.this.finish();
                    }
                };
                if (DEBUG)
                {
                    splashHandler.post(launcherRunnable);
                }
                else{
    
    
                    splashHandler.postDelayed(launcherRunnable, DURATION);
                }
    
            }
                  else{
    
                      if(mobileConnect()){
    
    
                          if(inetAddr()){
                          aphandle = APIHandling.getInstance();
                            aphandle.xmlCreateSession();
                            System.out.println("Net Connectivity is Present");
                            DURATION = Integer.valueOf(getString(R.string.splash_duration));
    
    
    
                            splashHandler = new Handler();
    
                            //  ================ Main Code of the Application
                            launcherRunnable = new Runnable() {
    
                                public void run() {
                                    Intent i = new Intent(YumZingSplashActivity.this, YumZingTabHostActivity.class);
                                    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                                    startActivity(i);
                                    YumZingSplashActivity.this.finish();
                                }
                            };
                            if (DEBUG)
                            {
                                splashHandler.post(launcherRunnable);
                            }
                            else{
    
    
                                splashHandler.postDelayed(launcherRunnable, DURATION);
                            }
                          }else{
    
                              AlertDialog.Builder myAlertDialog = new AlertDialog.Builder(YumZingSplashActivity.this);
                             myAlertDialog.setTitle("--- Connectivity Check ---");
                             myAlertDialog.setMessage("No Internet Connectivity");
                             myAlertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
    
                              public void onClick(DialogInterface arg0, int arg1) {
    
                                YumZingSplashActivity.this.finish();
                                //splashHandler.removeCallbacks(launcherRunnable);
    
                              }});
                                System.out.println("No Internet Connectivity");
    
                                myAlertDialog.show();       
                          }
                      }else{
    
    
    
    
                             AlertDialog.Builder myAlertDialog = new AlertDialog.Builder(YumZingSplashActivity.this);
                             myAlertDialog.setTitle("--- Connectivity Check ---");
                             myAlertDialog.setMessage("No Internet Connectivity");
                             myAlertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
    
                              public void onClick(DialogInterface arg0, int arg1) {
    
                                YumZingSplashActivity.this.finish();
                                //splashHandler.removeCallbacks(launcherRunnable);
    
                              }});
                                System.out.println("No Internet Connectivity");
    
                                myAlertDialog.show();           
    
    
    
    
    
    
                      }
    
                  }
            }
    
         //setContentView(R.layout.yumzing_splash_layout);
        }  catch(Exception ex){
    
                System.out.println("Leak ko catch");
            }
    
    
    
        }
    

    【讨论】:

    • @Mighter 我已经优化了我的代码,请参阅inetAddr() 方法。以前我试图进行名称解析,但这有时会具有欺骗性,因为 DNS 表可能尚未刷新, 当网络中断而 wifi 路由器仍处于开启状态时...So NOW i am using the TimeService which runs at port 37.
    【解决方案5】:

    您可以连接到 wifi 网络,尝试连接到后台的任何页面并验证是否有任何重定向。如果是这样,很可能是凭证页面。事实上,当我试图找到如何实现我刚才描述的解决方案时,我发现它在HttpURLConnection class documentation at Android 开发者网站上有所描述。在那里你可以阅读:

    处理网络登录

    在用户点击登录页面之前,某些 Wi-Fi 网络会阻止 Internet 访问。此类登录页面通常使用 HTTP 重定向来呈现。您可以使用getURL() 来测试您的连接是否被意外重定向。此检查在收到响应标头后才有效,您可以通过调用getHeaderFields()getInputStream() 来触发。例如,要检查响应是否被重定向到意外主机:

    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
       try {
         InputStream in = new BufferedInputStream(urlConnection.getInputStream());
         if (!url.getHost().equals(urlConnection.getURL().getHost())) {
           // we were redirected! Kick the user out to the browser to sign on?
    
         ...
       } finally {
         urlConnection.disconnect();
       }
     }
    

    【讨论】:

      【解决方案6】:

      试试

      InetAddress.getByName(host).isReachable(timeOut)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-21
        • 1970-01-01
        相关资源
        最近更新 更多