如何检查当前的互联网连接是否可用于android

moh*_*han 35 android internet-connection

我也想离线执行我的应用程序,所以我需要检查当前是否有可用的互联网连接.任何人都可以告诉我如何在Android中检查互联网是否可用?提供示例代码.我尝试使用下面的代码并使用模拟器进行检查,但它无法正常工作

public  boolean isInternetConnection() 
{ 

    ConnectivityManager connectivityManager =  (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    return connectivityManager.getActiveNetworkInfo().isConnectedOrConnecting(); 
} 
Run Code Online (Sandbox Code Playgroud)

谢谢

jam*_*mes 66

这将告诉您是否已连接到网络:

boolean connected = false;
ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    if(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED || 
            connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED) {
        //we are connected to a network
        connected = true;
    }
    else
        connected = false;
Run Code Online (Sandbox Code Playgroud)

警告:如果您连接到不包含Internet访问或需要基于浏览器的身份验证的WiFi网络,connected则仍然如此.

您需要在清单中获得此权限:

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

  • 你好。我在 Android 4.0 操作系统上的应用程序中使用了相同的代码。但它给出了空指针异常。 (2认同)
  • 顺便说一句,您还应该检查ConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)!= null,否则您可以在某些平板电脑上获取NullPointer (2认同)
  • 阅读此处的 Android 文档 http://developer.android.com/reference/android/net/ConnectivityManager.html 显示上面的 getNetworkInfo 用法已被弃用,但该方法仍然存在,采用不同的参数(网络而不是 int) (2认同)

Bru*_*ira 14

此外,请注意,有时用户将连接到Wi-Fi网络,但该网络可能需要基于浏览器的身份验证.大多数机场和酒店热点都是这样,所以你的应用程序可能会被认为你有连接,然后任何URL提取实际上将检索热点的登录页面而不是你正在寻找的页面.

根据执行此检查的重要性,除了检查与ConnectivityManager的连接之外,我建议包括代码以检查它是否是一个有效的Internet连接,而不仅仅是一种错觉.您可以尝试从站点获取已知地址/资源,例如1x1 PNG图像或1字节文本文件.

  • 感谢帖子,欢迎来到Stackoverflow.作为FYI,您不应在此处的帖子中添加签名. (2认同)

San*_*inh 13

在 API 29 上已弃用。

getActiveNetworkInfo在 API 29 中已弃用。因此我们可以在下面的 29 中使用它。

Kotlin 中针对所有 API 的新代码

fun isNetworkAvailable(context: Context): Boolean {
    val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
   
    // For 29 api or above
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        val capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork) ?: return false
        return when {
            capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ->    true
            capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) ->   true
            capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) ->   true
            else ->     false
         }
    }
    // For below 29 api
    else {
        if (connectivityManager.activeNetworkInfo != null && connectivityManager.activeNetworkInfo!!.isConnectedOrConnecting) {
            return true
        }
    }
    return false
}
Run Code Online (Sandbox Code Playgroud)


san*_*ram 9

使用以下代码:

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

如果isNetworkAvailable()返回true可用的互联网连接,否则互联网连接不可用

这里需要在您的应用程序清单文件中添加以下uses-Permission

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


Sam*_*rov 8

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

Google 推荐使用此代码块来检查互联网连接。因为设备即使连接到 WiFi 也可能没有互联网连接。


小智 6

代码 :

    fun isInternetConnection(): Boolean {
    var returnVal = false
    thread {
        returnVal = try {
            khttp.get("https://www.google.com/")
            true
        }catch (e:Exception){
            false
        }
    }.join()
    return returnVal
}
Run Code Online (Sandbox Code Playgroud)

摇篮:

implementation 'io.karn:khttp-android:0.1.0'
Run Code Online (Sandbox Code Playgroud)

我使用khttp因为它很容易使用。

因此,在上面的代码中,如果成功连接到 google.com,则返回 true,否则返回 false。


小智 5

使用下一个代码:

public static boolean isNetworkAvaliable(Context ctx) {
    ConnectivityManager connectivityManager = (ConnectivityManager) ctx
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    if ((connectivityManager
            .getNetworkInfo(ConnectivityManager.TYPE_MOBILE) != null && connectivityManager
            .getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED)
            || (connectivityManager
                    .getNetworkInfo(ConnectivityManager.TYPE_WIFI) != null && connectivityManager
                    .getNetworkInfo(ConnectivityManager.TYPE_WIFI)
                    .getState() == NetworkInfo.State.CONNECTED)) {
        return true;
    } else {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

请记住,您需要将下一行放入清单中:

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


Mas*_*ali 5

您可以使用两种方法:

1-用于检查连接:

   private boolean isNetworkConnected() {
        ConnectivityManager cm = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
        return cm.getActiveNetworkInfo() != null;
    }
Run Code Online (Sandbox Code Playgroud)

2-支票上网:

  public boolean internetIsConnected() {
        try {
            String command = "ping -c 1 google.com";
            return (Runtime.getRuntime().exec(command).waitFor() == 0);
        } catch (Exception e) {
            return false;
        }
    }
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)

  • 我用模拟器测试了版本 2(API 24,权限在那里),但它不起作用:有网络/互联网连接,但代码冻结了应用程序(所以不要在主线程上运行它!),然后返回“ false” 大约 10 秒后(无例外)。我是否缺少完成这项工作所需的任何东西? (2认同)

Abd*_*din 5

此代码用于检查所有 Android 版本(包括 Android 9.0 及更高版本)的网络可用性:

public static boolean isNetworkConnected(Context  context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = cm.getActiveNetworkInfo();
    // For 29 api or above
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork());
        return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||
                capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) ||
                capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
    } else return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
Run Code Online (Sandbox Code Playgroud)

不要忘记在清单中添加网络状态权限

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

另外,在方法之前添加 @SuppressWarnings( "deprecation" ) 以避免 android studio 弃用警告。