如何以编程方式检查Android中的互联网连接的可用性?

Fah*_*had 18 java android internet-connection android-manifest android-emulator

我想以编程方式检查Android手机/模拟器中是否存在互联网连接.因此,一旦我确定存在互联网连接,那么我将打电话给互联网.

所以它就像"嘿模拟器!如果你有互联网连接,那么请打开这个页面,否则doSomeThingElse();"

Chr*_*ner 26

我为自己实现的方法:

/*
 * isOnline - Check if there is a NetworkConnection
 * @return boolean
 */
protected boolean isOnline() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnected()) {
        return true;
    } else {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这是NetworkConnection-Check.如果有NetworkConnection,则不必是InternetConnection.


ton*_*099 11

连接到网络并不能保证互联网连接.

您可能已连接到家庭的无线网络,但您可能没有互联网连接.或者,您可能在餐厅,您可以连接到wifi,但仍然需要热点的密码才能使用互联网.在这种情况下,上述方法将返回true,但设备不会有互联网,如果没有正确的尝试和捕获包围,应用程序可能会崩溃.

底线,网络连接,并不意味着互联网连接,它只是意味着您的设备的无线硬件可以连接到另一台主机,两者都可以建立连接.

以下是一种方法,可以检查设备是否可以连接到网站并相应地返回答案.

if (networkConnectivity())
{
    try
    {
        HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.anywebsiteyouthinkwillnotbedown.com").openConnection());
        urlc.setRequestProperty("User-Agent", "Test");
        urlc.setRequestProperty("Connection", "close");
        urlc.setConnectTimeout(3000); //choose your own timeframe
        urlc.setReadTimeout(4000); //choose your own timeframe
        urlc.connect();
        networkcode2 = urlc.getResponseCode();
        return (urlc.getResponseCode() == 200);
    } catch (IOException e)
    {
        return (false);  //connectivity exists, but no internet.
    }
} else
{
    return false;  //no connectivity
}
Run Code Online (Sandbox Code Playgroud)


mhd*_*ati 8

至于问题标题,你想检查互联网访问,

所以最快的方式,至少目前是有效的,

thnx 根据他的回答levit :https://stackoverflow.com/a/27312494/3818437

如果您只是想检查与任何网络的连接 - 如果互联网可用则不关心 - 那么这里的大部分答案(包括已接受的),实现isConnectedOrConnecting()都能正常工作.如果您想知道您是否有互联网连接(如问题标题所示),请在Ping上阅读主要名称服务器

 public boolean isOnline() {

     Runtime runtime = Runtime.getRuntime();
     try {

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

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

而已!是的,简短,是的,它很快,不需要在后台运行,不需要root权限.

可能的问题

这真的够快吗?

是的,非常快!

除了在互联网上测试一些东西之外,是否真的没有可靠的方法来检查互联网是否可用?

不是我所知,但请告诉我,我会编辑我的答案.

难道我不能ping我自己的页面,我想要请求吗?

当然!如果您想区分"可用的互联网连接"和您自己的服务器,您甚至可以检查两者

如果DNS关闭怎么办?

Google DNS(例如8.8.8.8)是全球最大的公共DNS服务.截至2013年,它每天为1300亿个请求提供服务.我们只是说,你的应用程序没有响应可能不是当天的话题.

需要哪些权限?

只是互联网访问 - 什么惊喜^^(顺便说一句,你有没有想过,如果没有这个许可,这里建议的一些方法甚至可能有关于互联网可用性的远程胶水?)


evi*_*one 2

尝试这个:

ConnectivityManager connec = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

if(connec.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED || connec.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTING  ) {
   text.setText("hey your online!!!")     ;               
   //Do something in here when we are connected   
} else if(connec.getNetworkInfo(0).getState() == NetworkInfo.State.DISCONNECTED ||  connec.getNetworkInfo(1).getState() == NetworkInfo.State.DISCONNECTED   ) {
   text.setText("Look your not online");           
}
Run Code Online (Sandbox Code Playgroud)