Android 检查internet连接而不是网络状态
我的应用程序在离线模式下也能正常工作,当互联网可用时也能正常工作。我正在使用以下代码检查internet连接Android 检查internet连接而不是网络状态,android,internet-connection,network-state,Android,Internet Connection,Network State,我的应用程序在离线模式下也能正常工作,当互联网可用时也能正常工作。我正在使用以下代码检查internet连接 ConnectivityManagercm = (ConnectivityManager) ConnectivityClass.getInstance().getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetwo
ConnectivityManagercm = (ConnectivityManager) ConnectivityClass.getInstance().getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
问题是,若我们连接的WiFi网络不包括互联网接入或需要基于浏览器的身份验证,它仍然会返回true。如果internet不可用,则返回false。我需要检查互联网连接,而不是移动网络连接状态
第15版
您可以ping URL。然后你就可以知道互联网是完全可用的
public Boolean isInternetAvailable() {
try {
Process process = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
boolean avaiablility = (p1.waitFor()==0);
return avaiablility;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
希望使用此代码,您可以检查网络连接
public class InternetCheckerTask extends AsyncTask<Void, Void, Void> {
private OnInternetCheckListener listener;
private int authStatus;
private boolean running;
public InternetCheckerTask(OnInternetCheckListener listener) {
this.listener = listener;
}
@Override
protected Void doInBackground(Void... voids) {
running = true;
if(isInternetReallyAvailable()) {
authStatus = AuthConstants.CONNECTED;
} else {
authStatus = AuthConstants.NOT_CONNECTED;
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
if(listener != null) {
listener.onResponse(authStatus);
}
running = false;
}
// should not be called from ui thread, can be called only from background service
private boolean isInternetReallyAvailable() {
ConnectivityManager cm = (ConnectivityManager) App.getInstance().getBaseContext().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if(activeNetwork == null || !activeNetwork.isAvailable() || !activeNetwork.isConnected()) {
return false;
} else {
// TCP/HTTP/DNS (depending on the port, 53=DNS, 80=HTTP, etc.)
try {
int timeoutMs = 1500;
Socket sock = new Socket();
SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53);
sock.connect(sockaddr, timeoutMs);
sock.close();
return true;
} catch (IOException e) {
return false;
}
}
}
public boolean isRunning() {
return running;
}
public interface OnInternetCheckListener {
void onResponse(int status);
}
这就是您应该在任何需要的地方使用此功能的方式
new InternetCheckerTask(new InternetCheckerTask.OnInternetCheckListener() {
@Override
public void onResponse(int status) {
switch (status) {
case AuthConstants.CONNECTED:
// connection is available
break;
default:
// no connection
break;
}
}
}).execute();
- 选中以处理wifi和移动数据之间的网络更改。
new InternetCheckerTask(new InternetCheckerTask.OnInternetCheckListener() {
@Override
public void onResponse(int status) {
switch (status) {
case AuthConstants.CONNECTED:
// connection is available
break;
default:
// no connection
break;
}
}
}).execute();
public static boolean isOnline(Context ctx) {
ConnectivityManager cm = (ConnectivityManager) ctx
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm != null
? cm.getActiveNetworkInfo()
: null;
return netInfo != null && netInfo.isConnectedOrConnecting();
}