21

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

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

4

6 回答 6

2

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

你也需要CHANGE_NETWORK_STATE许可。

于 2012-08-23T14:25:03.640 回答
2

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

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

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

于 2012-08-20T10:39:48.900 回答
2

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

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

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

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

于 2012-08-20T12:14:39.987 回答
1

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

处理网络登录

某些 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();
   }
 }
于 2012-08-27T05:55:22.590 回答
1

尝试这个....

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

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

而且我正在使用wifi 连接仍处于打开状态时TimeService at port 37知道Internet 已死

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

现在我把complete working code我做的放在这里。请原谅我,因为DRY(不要重复自己的原则)在这里被滥用了。所以在生产网络中使用时请重构代码并将重复的代码转换为方法,即转换为a 。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");
        }



    }
于 2012-08-20T10:19:49.347 回答
0

Try

InetAddress.getByName(host).isReachable(timeOut)
于 2012-08-27T07:21:25.540 回答