假设手机找到开放的 wi-fi 网络并连接到它。但是 wi-fi 网络处于“非活动状态”,即当您打开浏览器时,您会看到输入凭据的提示。我的手机上有很多应用程序(例如网络浏览器),在这种情况下无法正常工作。我想使用移动网络发送数据,但系统仍然尝试使用wi-fi。
NetworkInfo.isAvailable()
并且NetworkInfo.isConnected()
仍然返回true
所描述的wi-fi网络。有什么解决办法吗?
假设手机找到开放的 wi-fi 网络并连接到它。但是 wi-fi 网络处于“非活动状态”,即当您打开浏览器时,您会看到输入凭据的提示。我的手机上有很多应用程序(例如网络浏览器),在这种情况下无法正常工作。我想使用移动网络发送数据,但系统仍然尝试使用wi-fi。
NetworkInfo.isAvailable()
并且NetworkInfo.isConnected()
仍然返回true
所描述的wi-fi网络。有什么解决办法吗?
只是一个建议:您可以尝试使用requestRouteToHost()。但首先搜索 SO 使用这种方法的问题。
你也需要CHANGE_NETWORK_STATE
许可。
我一直有同样的问题,我发现通过Android SDK没有这种可能性,你必须编写自己的方式来做到这一点。
这取决于您想对网络做什么以及“非活动”是什么意思 - 您可以连接到没有连接到 Internet 的路由器,并且没有 Android 方法可以检查这种情况。正如MrMichael 所写,ping 是检查它的一种方法,但在这种情况下,阳性测试只会为您提供有关 ping 的信息 - 网络可能有一些允许您发送 ping 的重型防火墙,但即不会让 HTTP 请求通过。
在这种情况下,您必须根据自己的需要编写自己的自定义测试,唉——这就是我所做的。我刚刚实现了简单的类似 ping 的协议(我尝试在正确的 IP/端口上连接我的套接字并发送短消息等待简短的回答)。只有这样才能让我 100% 保证可以建立我想要的连接。
据我所知,没有办法强制通过 wifi 使用数据连接(也许在没有用户交互的情况下你不应该做的事情)。
我的许多应用程序都有相同的要求,我想知道在加载初始屏幕时它们是否具有可行的网络连接(例如,如果没有,我会显示应用程序的只读版本)。
我解决这个问题的方法是向我的服务器发起一个简单的服务调用,isAlive
它只会立即返回一个 true。这不仅告诉我我可以看到我的服务,而且还确认我的服务器在线(我这边没有问题)。如果我没有及时得到回复,我会通知用户他们没有网络连接,并且“请确保您有有效的数据/wifi 连接,然后再继续”。然后,我获取isConnected
wifi 的属性并将此消息修改为“您当前的无线连接无法访问互联网”或类似内容。
不是您希望的答案,但也许有可能?
您可以连接到 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();
}
}
尝试这个....
我需要做一些自定义工作..但是让它运行起来......
我的代码关闭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");
}
}
Try
InetAddress.getByName(host).isReachable(timeOut)