假设手机找到开放的Wi-Fi网络并连接到它。但是,Wi-Fi网络处于非活动状态,即当您打开浏览器时,您会看到凭据提示。我的手机上有很多应用程序(例如网络浏览器),在这种情况下无效。 我想使用移动网络发送数据,但系统仍尝试使用 wi-fi。
对于所描述的 wi-fi 网络, NetworkInfo.isAvailable()
和NetworkInfo.isConnected()
仍会返回true
。
任何解决方案?
答案 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)