处理不活跃的Wi-Fi网络

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

对于所描述的Wi-Fi网络, NetworkInfo.isAvailable()NetworkInfo.isConnected()仍然返回true 。 有解决方案吗

  • 运行MyActivity时出错:Gradle项目同步失败。 请修复您的项目,然后重试
  • 如何使用onWindowFocusChanged()方法?
  • Android Studio找不到来自lombok的AllArgsConstructor
  • 如何使用Google提供程序在Firebase上重新validation用户?
  • 获取android联系电话号码列表
  • 最佳实践:Android上的布局(程序化与XML)
  • 从非ui线程启动和活动是否安全?
  • 在android中的cardview中有三个小点的小部件的名称是什么?
  • 我一直遇到同样的问题,我发现通过Android SDK没有这种可能性,你必须用自己的方式来做。

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

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

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

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

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

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

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

    您还需要CHANGE_NETWORK_STATE权限。

    尝试这个….

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

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

    TimeService at port 37使用TimeService at port 37来知道互联网是DEAD而wifi连接仍然是ON

    //////////////////////////编辑/////////////////////// ///////////

    现在我在这里提出一个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"); } } 

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

    处理网络登录

    某些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(); } } 

    尝试

     InetAddress.getByName(host).isReachable(timeOut)