处理不活跃的Wi-Fi网络

时间:2012-08-10 11:12:49

标签: android

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

对于所描述的 wi-fi 网络,

NetworkInfo.isAvailable()NetworkInfo.isConnected()仍会返回true。 任何解决方案?

6 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,而我发现Android SDK没有这种可能性,你必须自己编写方法来做到这一点。

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

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

答案 1 :(得分:2)

据我所知,没有办法强制在wifi上使用数据连接(不管怎么说,如果没有用户交互,你不应该这样做。)

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

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

不是你希望的答案,但可能是一种可能性?

答案 2 :(得分:2)

只是一个建议:您可以尝试使用requestRouteToHost()。但首先要搜索SO以了解使用此方法的问题。

此外,您还需要CHANGE_NETWORK_STATE权限。

答案 3 :(得分:1)

试试这个......

我需要做一些自定义工作..但是把它运行起来......

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

我正在使用TimeService at port 37知道互联网是DEAD而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");
        }



    }

答案 4 :(得分:1)

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

处理网络登录

某些Wi-Fi网络会阻止互联网访问,直到用户点击登录页面为止。此类登录页面通常使用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();
   }
 }

答案 5 :(得分:0)

尝试

InetAddress.getByName(host).isReachable(timeOut)