Android检查互联网连接

iam*_*eyb 204 networking android android-networking

我想创建一个使用互联网的应用程序,我正在尝试创建一个检查连接是否可用的功能,如果不可用,请转到具有重试按钮和解释的活动.

附件是我的代码到目前为止,但我收到了错误 Syntax error, insert "}" to complete MethodBody.

现在我一直把这些放在试图让它工作,但到目前为止没有运气...任何帮助将不胜感激.

public class TheEvoStikLeagueActivity extends Activity {
    private final int SPLASH_DISPLAY_LENGHT = 3000;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);

        private boolean checkInternetConnection() {
            ConnectivityManager conMgr = (ConnectivityManager) getSystemService (Context.CONNECTIVITY_SERVICE);
            // ARE WE CONNECTED TO THE NET
            if (conMgr.getActiveNetworkInfo() != null
                    && conMgr.getActiveNetworkInfo().isAvailable()
                    && conMgr.getActiveNetworkInfo().isConnected()) {

                return true;

                /* New Handler to start the Menu-Activity
                 * and close this Splash-Screen after some seconds.*/
                new Handler().postDelayed(new Runnable() {
                    public void run() {
                        /* Create an Intent that will start the Menu-Activity. */
                        Intent mainIntent = new Intent(TheEvoStikLeagueActivity.this, IntroActivity.class);
                        TheEvoStikLeagueActivity.this.startActivity(mainIntent);
                        TheEvoStikLeagueActivity.this.finish();
                    }
                }, SPLASH_DISPLAY_LENGHT);
            } else {
                return false;

                Intent connectionIntent = new Intent(TheEvoStikLeagueActivity.this, HomeActivity.class);
                TheEvoStikLeagueActivity.this.startActivity(connectionIntent);
                TheEvoStikLeagueActivity.this.finish();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Ses*_*nay 394

此方法检查移动设备是否连接到互联网并在连接时返回true:

private boolean isNetworkConnected() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

    return cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected();
}
Run Code Online (Sandbox Code Playgroud)

在清单中,

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Run Code Online (Sandbox Code Playgroud)

编辑: 此方法实际检查设备是否连接到互联网(有可能它连接到网络但不连接到互联网).

public boolean isInternetAvailable() {
    try {
        InetAddress ipAddr = InetAddress.getByName("google.com"); 
        //You can replace it with your name
            return !ipAddr.equals("");

        } catch (Exception e) {
            return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是不正确的.如果您连接到未路由到Internet的网络,则此方法将错误地返回true.请注意,getActiveNetworkInfo的javadoc说你应该检查NetworkInfo.isConnected(),但这还不足以检查你是否在互联网上.我正在进一步研究它,但你可能不得不在互联网上ping服务器,以确保你真的在互联网上. (56认同)
  • 警惕isInternetAvailable()因为它可能在"主线程上的网络"异常上失败,因此即使你有连接也会返回false. (22认同)
  • isInternetAvailable()总是为我返回false.即使绕过捕获.我在上3G. (5认同)
  • 它是否也检查3G,EDGE,GPRS ...... (4认同)
  • DNS 地址被缓存。作为测试,循环此方法,然后从互联网上拔下路由器。它不断返回 true...尽管当 DNS 缓存超时时它最终会失败(这因 DNS 客户端而异)。唯一可靠的方法是尝试连接到互联网上的某些东西,并希望他们不介意您向他们提供大量连接。 (4认同)
  • 第一部分在主线程中起作用,第二部分(编辑)仅在不在主线程上起作用。 (2认同)
  • 两个答案都是错的,首先你检查一下是否连接了wifi(可以通过移动数据上网,也可以连接到没有网关的wifi)...第二检查一下DNS解析,是可以的GOOGLE [这是一个非常常见的名称] 已经缓存在 SO、路由器或其他任何地方,但连接不可用 (2认同)
  • 所做的编辑绝对是错误的,DNS记录被缓存,如果这个人打开了google(谁没有),只要dns寄存器存在,它就会返回,通常是24小时......所以这个方法是非常错误的 (2认同)

Jar*_*ows 73

检查以确保它"连接"到网络:

public boolean isNetworkAvailable(Context context) {
    ConnectivityManager connectivityManager = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE));
    return connectivityManager.getActiveNetworkInfo() != null && connectivityManager.getActiveNetworkInfo().isConnected();
}
Run Code Online (Sandbox Code Playgroud)

检查以确保它"连接"到网络:

public boolean isInternetAvailable() {
    try {
        InetAddress address = InetAddress.getByName("www.google.com");
        return !address.equals("");
    } catch (UnknownHostException e) {
        // Log error
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

需要许可:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Run Code Online (Sandbox Code Playgroud)

/sf/answers/1230832711/

  • 如何找到,连接到wifi,但实际上没有wifi上的活动数据. (4认同)
  • 仅告诉您是否连接到网络,而不是互联网.如果你想崩溃(对于互联网安全代码),那么使用它. (4认同)
  • 我可以看到每个人都将Google用作测试域。也许最好使用[am] .root-servers.org (2认同)

raz*_*zak 52

你可以简单地ping一个谷歌在线网站:

public boolean isConnected() throws InterruptedException, IOException {
    final String command = "ping -c 1 google.com";
    return Runtime.getRuntime().exec(command).waitFor() == 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您的应用程序依赖远程服务器(用于身份验证,获取数据,与数据库通信等),那么您可以使用该服务器地址而不是谷歌,这样您就可以检查互联网连接和服务器可用性时间.如果您的服务器已关闭且仍有互联网连接,则该应用程序无论如何都无法正常运行.在这种情况下,您可能还想使用`-i`选项为ping命令设置超时间隔,例如`ping -i 5 -c 1 www.myserver.com`. (20认同)
  • 那么@ZeeshanShabbir是对的,谷歌主要运营国家的太阳耀斑将把你的应用程序带出球场,在这种情况下你可以通过ping到几个地址来检查相同的情况.另外,我认为谷歌不会因为一个中心停机而停机,如果您的网络运营商在全球停电中幸存下来,其中大多数都必须停机才能工作:D (5认同)
  • 好的但不是最好的。这整个逻辑取决于 google.com 让我们假设如果 google 停机几分钟然后你的应用程序将无法运行几分钟 (2认同)
  • 所以你有什么建议? (2认同)
  • 在有wifi登录页面的场景下,这个方法会不会错误返回true? (2认同)

Bha*_*eri 26

当您连接到Wi-Fi源或通过手机数据包时,上述方法可以正常工作.但是在Wi-Fi连接的情况下,有些情况下您会被要求在Cafe中登录.因此,在这种情况下,当您连接到Wi-Fi源而不是Internet时,您的应用程序将会失败.

这种方法很好.

    public static boolean isConnected(Context context) {
        ConnectivityManager cm = (ConnectivityManager)context
                .getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    if (activeNetwork != null && activeNetwork.isConnected()) {
        try {
            URL url = new URL("http://www.google.com/");
            HttpURLConnection urlc = (HttpURLConnection)url.openConnection();
            urlc.setRequestProperty("User-Agent", "test");
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(1000); // mTimeout is in seconds
            urlc.connect();
            if (urlc.getResponseCode() == 200) {
                return true;
            } else {
                return false;
            }
        } catch (IOException e) {
            Log.i("warning", "Error checking internet connection", e);
            return false;
        }
    }

    return false;

}
Run Code Online (Sandbox Code Playgroud)

请在主线程的单独线程中使用它,因为它进行网络调用,如果不遵循则会抛出NetwrokOnMainThreadException.

并且也不要将此方法放在onCreate或任何其他方法中.把它放在一个类中并访问它.

  • 这是解决问题的好方法.但是ping可能就足够了 (2认同)

Pra*_*ani 22

您可以使用以下代码段来检查Internet连接.

无论是哪种方式,您都可以检查哪种类型的NETWORK Connection可用,这样您就可以通过这种方式完成流程.

您只需复制以下类并直接粘贴到您的包中即可.

/**
 * @author Pratik Butani
 */
public class InternetConnection {

    /**
     * CHECK WHETHER INTERNET CONNECTION IS AVAILABLE OR NOT
     */
    public static boolean checkConnection(Context context) {
        final ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        if (connMgr != null) {
            NetworkInfo activeNetworkInfo = connMgr.getActiveNetworkInfo();

            if (activeNetworkInfo != null) { // connected to the internet
                // connected to the mobile provider's data plan
                if (activeNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
                    // connected to wifi
                    return true;
                } else return activeNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE;
            }
        }
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以使用:

if (InternetConnection.checkConnection(context)) {
    // Its Available...
} else {
    // Not Available...
}
Run Code Online (Sandbox Code Playgroud)

不要忘记取得许可:) :)

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
Run Code Online (Sandbox Code Playgroud)

您可以根据您的要求进行修改.

谢谢.


Han*_*ans 17

接受的答案的编辑显示了如何检查是否可以访问互联网上的内容.如果不是这样的话,我不得不等待太久的答案(没有互联网连接的wifi).不幸的是InetAddress.getByName没有超时参数,所以下一个代码可以解决这个问题:

private boolean internetConnectionAvailable(int timeOut) {
    InetAddress inetAddress = null;
    try {
        Future<InetAddress> future = Executors.newSingleThreadExecutor().submit(new Callable<InetAddress>() {
            @Override
            public InetAddress call() {
                try {
                    return InetAddress.getByName("google.com");
                } catch (UnknownHostException e) {
                    return null;
                }
            }
        });
        inetAddress = future.get(timeOut, TimeUnit.MILLISECONDS);
        future.cancel(true);
    } catch (InterruptedException e) {
    } catch (ExecutionException e) {
    } catch (TimeoutException e) {
    } 
    return inetAddress!=null && !inetAddress.equals("");
}
Run Code Online (Sandbox Code Playgroud)


MBy*_*ByD 14

你不能在另一个方法中创建一个方法,移出private boolean checkInternetConnection() {方法onCreate


Lok*_*ari 9

所有官方方法仅告知设备是否为网络开放,
如果您的设备连接到Wifi但Wifi没有连接到互联网,那么这些方法将失败(这种情况很多次发生),没有内置网络检测方法会告诉您这一点场景,所以创建了Async Callback类,它将在onConnectionSuccessonConnectionFail中返回

        new CheckNetworkConnection(this, new CheckNetworkConnection.OnConnectionCallback() {

            @Override
            public void onConnectionSuccess() {
   Toast.makeText(context, "onSuccess()", toast.LENGTH_SHORT).show();
            }

            @Override
            public void onConnectionFail(String msg) {
   Toast.makeText(context, "onFail()", toast.LENGTH_SHORT).show();
            }
        }).execute();
Run Code Online (Sandbox Code Playgroud)

来自异步任务的网络呼叫

public class CheckNetworkConnection extends AsyncTask<Void, Void, Boolean> {
private OnConnectionCallback onConnectionCallback;
private Context context;

public CheckNetworkConnection(Context con, OnConnectionCallback onConnectionCallback) {
     super();
     this.onConnectionCallback = onConnectionCallback;
    this.context = con;
}

@Override
protected void onPreExecute() {
    super.onPreExecute();
}

@Override
protected Boolean doInBackground(Void... params) {
    if (context == null)
        return false;

    boolean isConnected = new NetWorkInfoUtility().isNetWorkAvailableNow(context);
    return isConnected;
}

@Override
protected void onPostExecute(Boolean b) {
    super.onPostExecute(b);

    if (b) {
        onConnectionCallback.onConnectionSuccess();
    } else {
        String msg = "No Internet Connection";
        if (context == null)
            msg = "Context is null";
        onConnectionCallback.onConnectionFail(msg);
    }

}

public interface OnConnectionCallback {
    void onConnectionSuccess();

    void onConnectionFail(String errorMsg);
}
}
Run Code Online (Sandbox Code Playgroud)

将ping到服务器的实际类

class NetWorkInfoUtility {

public boolean isWifiEnable() {
    return isWifiEnable;
}

public void setIsWifiEnable(boolean isWifiEnable) {
    this.isWifiEnable = isWifiEnable;
}

public boolean isMobileNetworkAvailable() {
    return isMobileNetworkAvailable;
}

public void setIsMobileNetworkAvailable(boolean isMobileNetworkAvailable) {
    this.isMobileNetworkAvailable = isMobileNetworkAvailable;
}

private boolean isWifiEnable = false;
private boolean isMobileNetworkAvailable = false;

public boolean isNetWorkAvailableNow(Context context) {
    boolean isNetworkAvailable = false;

    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    setIsWifiEnable(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected());
    setIsMobileNetworkAvailable(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnected());

    if (isWifiEnable() || isMobileNetworkAvailable()) {
        /*Sometime wifi is connected but service provider never connected to internet
        so cross check one more time*/
        if (isOnline())
            isNetworkAvailable = true;
    }

    return isNetworkAvailable;
}

public boolean isOnline() {
    /*Just to check Time delay*/
    long t = Calendar.getInstance().getTimeInMillis();

    Runtime runtime = Runtime.getRuntime();
    try {
        /*Pinging to Google server*/
        Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
        int exitValue = ipProcess.waitFor();
        return (exitValue == 0);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        long t2 = Calendar.getInstance().getTimeInMillis();
        Log.i("NetWork check Time", (t2 - t) + "");
    }
    return false;
 }
}
Run Code Online (Sandbox Code Playgroud)


Xar*_*mer 7

不需要复杂.最简单的框架方式是使用ACCESS_NETWORK_STATE权限并只创建一个连接的方法

public boolean isOnline() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    return cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnectedOrConnecting();
}
Run Code Online (Sandbox Code Playgroud)

requestRouteToHost如果您有特定的主机和连接类型(wifi /移动),您也可以使用.

您还需要:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Run Code Online (Sandbox Code Playgroud)

在你的Android清单中.

更多细节请到这里


Ima*_*shi 6

使用此方法:

public static boolean isOnline() {
    ConnectivityManager cm = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    return netInfo != null && netInfo.isConnectedOrConnecting();
}
Run Code Online (Sandbox Code Playgroud)

这是需要的权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Run Code Online (Sandbox Code Playgroud)


Pra*_*gar 5

尝试以下代码:

public static boolean isNetworkAvailable(Context context) {
        boolean outcome = false;

        if (context != null) {
            ConnectivityManager cm = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo[] networkInfos = cm.getAllNetworkInfo();

            for (NetworkInfo tempNetworkInfo : networkInfos) {


                /**
                 * Can also check if the user is in roaming
                 */
                if (tempNetworkInfo.isConnected()) {
                    outcome = true;
                    break;
                }
            }
        }

        return outcome;
    }
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

314904 次

最近记录:

6 年,3 月 前