Android 检查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

我的应用程序在离线模式下也能正常工作,当互联网可用时也能正常工作。我正在使用以下代码检查internet连接

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