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

Posted

技术标签:

【中文标题】如何以编程方式检查 Android 中互联网连接的可用性?【英文标题】:How to programmatically check availibilty of internet connection in Android? 【发布时间】:2011-05-30 16:08:42 【问题描述】:

我想以编程方式检查 android 手机/模拟器中是否有互联网连接。因此,一旦我确定存在互联网连接,我就会拨打互联网电话。

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

【问题讨论】:

【参考方案1】:

此代码必须在后台线程中运行

fun hasActiveInternetConnection(): Boolean 
    return try 
        val ipAddr: InetAddress = InetAddress.getByName("google.com")
        !ipAddr.equals("")
     catch (e: java.lang.Exception) 
        false
    

【讨论】:

【参考方案2】:

我一直在使用这两种方法来检查互联网状态 有时 https 协议不起作用尝试 http 协议

// Check if network is available
public static boolean isNetworkAvailable() 
    ConnectivityManager cm = (ConnectivityManager)
            AppGlobals.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = cm.getActiveNetworkInfo();
    return networkInfo != null && networkInfo.isConnected();


// ping the google server to check if internet is really working or not
public static boolean isInternetWorking() 
    boolean success = false;
    try 
        URL url = new URL("https://google.com");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setConnectTimeout(10000);
        connection.connect();
        success = connection.getResponseCode() == 200;
     catch (IOException e) 
        e.printStackTrace();
    
    return success;

如果由于新的 android 安全性,http 无法正常工作,他们现在不允许纯文本通信。现在只是绕过它。

android:usesCleartextTraffic="true"

【讨论】:

【参考方案3】:

来自我的OLD Answer here

试试这个

我已经应用了@Levit提供的解决方案,并创建了不会调用额外Http请求的函数。

它将解决错误Unable to Resolve Host

public static boolean isInternetAvailable(Context context) 
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    if (activeNetwork == null) return false;

    switch (activeNetwork.getType()) 
        case ConnectivityManager.TYPE_WIFI:
            if ((activeNetwork.getState() == NetworkInfo.State.CONNECTED ||
                    activeNetwork.getState() == NetworkInfo.State.CONNECTING) &&
                    isInternet())
                return true;
            break;
        case ConnectivityManager.TYPE_MOBILE:
            if ((activeNetwork.getState() == NetworkInfo.State.CONNECTED ||
                    activeNetwork.getState() == NetworkInfo.State.CONNECTING) &&
                    isInternet())
                return true;
            break;
        default:
            return false;
    
    return false;


private static boolean isInternet() 

    Runtime runtime = Runtime.getRuntime();
    try 
        Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
        int exitValue = ipProcess.waitFor();
        Debug.i(exitValue + "");
        return (exitValue == 0);
     catch (IOException | InterruptedException e) 
        e.printStackTrace();
    

    return false;

现在这样称呼它,

if (!isInternetAvailable(getActivity())) 
     //Show message
 else 
     //Perfoem the api request

【讨论】:

什么是“/system/bin/ping -c 1 8.8.8.8”?【参考方案4】:

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

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

thnx to levit 基于他的回答 https://***.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; 

就是这样!是的,很短,是的,它很快,不,它不需要在后台运行,不,你不需要root权限。

可能的问题

这真的够快吗?

是的,非常快!

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

据我所知,但请告诉我,我会编辑我的答案。

我不能直接 ping 自己的页面吗?无论如何我都想请求它?

当然!如果您想区分两者,您甚至可以同时检查两者 “互联网连接可用”并且您自己的服务器可以访问

如果 DNS 出现故障怎么办?

Google DNS(例如 8.8.8.8)是全球最大的公共 DNS 服务 世界。截至 2013 年,它每天处理 1300 亿次请求。让我们只是 比如说,您的应用程序没有响应可能不会成为话题 天。

需要哪些权限?

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

【讨论】:

【参考方案5】:

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

您可能已连接到您家的 wifi,但您可能没有互联网连接。 或者,您可能在一家可以连接到 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

【讨论】:

你能解释一下你的代码吗?为什么要设置这些请求属性?这是检查互联网连接是否非常慢/弱连接的合适方法,从而最大限度地减少检查连接可用性的数据传输? @remi。它应该可以正常工作。看不到不这样做的理由。还没有在非常慢的连接上测试它。 它可以工作,但在此解决方案中存在 DNS 请求挂起的风险。设备将尝试解析网址,但可能无法访问 DNS 服务器本身。【参考方案6】:

因为您连接到网络并不能保证您有互联网,所以我只是在 try catch 块内拨打互联网电话。然后捕获 UnknownHostException 以处理没有互联网。

【讨论】:

【参考方案7】:

我自己实现的方法:

/*
 * 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;
    

请注意,这是一个 NetworkConnection-Check。如果有 NetworkConnection,它不一定是 InternetConnection。

【讨论】:

返回码可以简化为:return netInfo != null && netInfo.isConnected();【参考方案8】:

试试这个:

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");           

【讨论】:

以上是关于如何以编程方式检查 Android 中互联网连接的可用性?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式在 Android Q 中打开设置面板?

如何以编程方式检查 Android 中是不是安装了应用程序?

如何在 vc++ 中以编程方式检查互联网速度/带宽 [重复]

如何以编程方式通过 Wifi 获取连接在同一网络上的其他设备的 IP 地址?

如何检查我是不是在 android 4.4 及更高版本中以编程方式打开了 gps? [复制]

如何在 iOS 和 Android 的 React Native 应用程序中检查互联网连接?