如何在android中检查当前的互联网连接是不是可用
Posted
技术标签:
【中文标题】如何在android中检查当前的互联网连接是不是可用【英文标题】:How to check currently internet connection is available or not in android如何在android中检查当前的互联网连接是否可用 【发布时间】:2011-07-25 08:24:22 【问题描述】:我也想离线执行我的应用程序,所以我需要检查当前是否有可用的互联网连接。谁能告诉我如何检查互联网是否在android中可用?给出示例代码。我尝试使用下面的代码并使用模拟器进行检查,但它不起作用
public boolean isInternetConnection()
ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
return connectivityManager.getActiveNetworkInfo().isConnectedOrConnecting();
谢谢
【问题讨论】:
【参考方案1】:这将告诉您是否已连接到网络:
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;
警告:如果您连接到不包括互联网访问或需要基于浏览器的身份验证的 WiFi 网络,connected
仍然是正确的。
您需要在清单中获得此权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
【讨论】:
嗨。我在 Android 4.0 操作系统上的应用程序中使用了相同的代码。但它给出了空指针异常。 可能你的 android 4.0 设备没有 type_mobile 连接 顺便说一句,您还应该检查connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) != null,或者您可以在某些平板电脑上获取NullPointer 关于“ConnectivityManager 连接管理器 = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);”这一行我收到错误,所以我改为“Context ctx=this; ConnectivityManager connectivityManager = (ConnectivityManager)ctx.getSystemService(Context.CONNECTIVITY_SERVICE);”它有效 在此处阅读 Android 文档 developer.android.com/reference/android/net/… 表明上面的 getNetworkInfo 用法已被弃用,但该方法仍然存在,采用不同的参数(网络而不是 int)【参考方案2】:你可以使用两种方法:
1 - 检查连接:
private boolean isNetworkConnected()
ConnectivityManager cm = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
return cm.getActiveNetworkInfo() != null;
2 - 检查互联网:
public boolean internetIsConnected()
try
String command = "ping -c 1 google.com";
return (Runtime.getRuntime().exec(command).waitFor() == 0);
catch (Exception e)
return false;
向清单添加权限:
<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" />
【讨论】:
正在寻找第二个,以检查互联网是否可用。谢谢。 我用模拟器测试了第 2 版(API 24,有权限),但它不起作用:有网络/互联网连接,但代码冻结了应用程序(所以不要在主线程!),然后在大约 10 秒后返回“false”(无异常)。我是否遗漏了完成这项工作所需的任何东西?【参考方案3】:另外,请注意,有时用户会连接到 Wi-Fi 网络,但该网络可能需要基于浏览器的身份验证。大多数机场和酒店热点都是这样,因此您的应用程序可能会误以为您已连接,然后任何 URL 获取实际上都会检索热点的登录页面,而不是您正在查找的页面。
根据执行此检查的重要性,除了检查与 ConnectivityManager 的连接之外,我还建议包含代码以检查它是否是有效的 Internet 连接,而不仅仅是一种错觉。您可以通过尝试从您的网站获取已知地址/资源来做到这一点,例如 1x1 PNG 图像或 1 字节文本文件。
【讨论】:
感谢您的帖子,欢迎来到 ***。作为仅供参考,您不应在此处的帖子中包含签名。【参考方案4】:使用下面的代码:
private boolean isNetworkAvailable()
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
如果 isNetworkAvailable() 返回 true
则互联网连接可用,否则互联网连接不可用
这里需要在你的应用Manifest文件中的uses-permission下面添加
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
【讨论】:
【参考方案5】:public boolean isOnline()
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting())
return true;
else
return false;
Google 推荐使用此代码块检查互联网连接。因为即使连接到WiFi,设备也可能没有互联网连接。
【讨论】:
【参考方案6】:在 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
【讨论】:
再次启用 wifi 按钮时,我仍然有能力 == null,能力需要大约 30 秒!= null【参考方案7】:代码:
fun isInternetConnection(): Boolean
var returnVal = false
thread
returnVal = try
khttp.get("https://www.google.com/")
true
catch (e:Exception)
false
.join()
return returnVal
分级:
implementation 'io.karn:khttp-android:0.1.0'
我使用khttp,因为它很容易使用。
所以在上面的代码中,如果成功连接到google.com,则返回true,否则返回false。
【讨论】:
这适用于 java 吗? 是的,它必须这样做。语法会略有不同,因为这是在 Kotlin 中。不要忘记在 gradle 中添加 khttp 库。【参考方案8】:使用下一个代码:
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;
请记住,您需要在清单中放入下一行:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
【讨论】:
【参考方案9】:您可以尝试建立与远程主机的 TCP 连接:
public boolean hostAvailable(String host, int port)
try (Socket socket = new Socket())
socket.connect(new InetSocketAddress(host, port), 2000);
return true;
catch (IOException e)
// Either we have a timeout or unreachable host or failed DNS lookup
System.out.println(e);
return false;
然后:
boolean online = hostAvailable("www.google.com", 80);
【讨论】:
此方法需要 API 级别 19 这不起作用。连接到没有互联网的 wifi 网络时继续返回 true。【参考方案10】:此代码用于检查所有 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();
不要忘记在清单中添加网络状态权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
另外,在方法前添加@SuppressWarnings("deprecation") 以避免android studio deprecation警告。
【讨论】:
【参考方案11】:这里,是你可以使用的方法。这适用于所有 API。
public boolean isConnected()
ConnectivityManager cm = (ConnectivityManager) getApplicationContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (cm == null)
return false;
/* NetworkInfo is deprecated in API 29 so we have to check separately for higher API Levels */
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
Network network = cm.getActiveNetwork();
if (network == null)
return false;
NetworkCapabilities networkCapabilities = cm.getNetworkCapabilities(network);
if (networkCapabilities == null)
return false;
boolean isInternetSuspended = !networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED);
return networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
&& networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
&& !isInternetSuspended;
else
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
return networkInfo != null && networkInfo.isConnected();
【讨论】:
@TaslimOseni 是的,但是为了支持较低的 Api,我们必须使用它。对于 API 29 及更高版本,我们可以使用getActiveNetwork()
。对于正确的实现,请参阅 github 上的此代码。 github.com/ankidroid/Anki-Android/pull/8331
是的。我现在明白了。【参考方案12】:
尝试使用ConnectivityManager
ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null)
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null)
for (int i = 0; i < info.length; i++)
if (info[i].getState() == NetworkInfo.State.CONNECTED)
return true;
return false
还为 AndroidManifest.xml 添加权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
【讨论】:
【参考方案13】: public boolean isInternetConnection()
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
return true;
else
return false;
【讨论】:
【参考方案14】:public static boolean isInternetConnection(Context mContext)
ConnectivityManager connectivityManager = (ConnectivityManager)mContext.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
return true;
else
return false;
【讨论】:
这与接受的答案并没有什么不同。此外,isInternetConnection
具有误导性,因为设备可以连接到没有提供互联网的网络,在这种情况下,函数将返回 true
。【参考方案15】:
使用方法checkConnectivity:
if (checkConnectivity())
//do something
检查连接的方法:
private boolean checkConnectivity()
boolean enabled = true;
ConnectivityManager connectivityManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = connectivityManager.getActiveNetworkInfo();
if ((info == null || !info.isConnected() || !info.isAvailable()))
Toast.makeText(getApplicationContext(), "Sin conexión a Internet...", Toast.LENGTH_SHORT).show();
return false;
else
return true;
return false;
【讨论】:
【参考方案16】:这个功能很好用……
public void checkConnection()
ConnectivityManager connectivityManager=(ConnectivityManager)
this.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo wifi=connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
NetworkInfo network=connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (wifi.isConnected())
//Internet available
else if(network.isConnected())
//Internet available
else
//Internet is not available
将权限添加到AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
【讨论】:
【参考方案17】:如果没有网络连接,这将显示一个对话框错误框
ConnectivityManager connMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected())
// fetch data
else
new AlertDialog.Builder(this)
.setTitle("Connection Failure")
.setMessage("Please Connect to the Internet")
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener()
public void onClick(DialogInterface dialog, int which)
)
.setIcon(android.R.drawable.ic_dialog_alert)
.show();
【讨论】:
【参考方案18】:public boolean isNetworkAvailable(Context context)
ConnectivityManager connectivityManager = (ConnectivityManager) context
.getSystemService(context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager
.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
【讨论】:
【参考方案19】:你可以试试这个:
private boolean isConnectedToWifi()
ConnectivityManager cm = (ConnectivityManager) getApplication().getSystemService(Context.CONNECTIVITY_SERVICE);
if(cm != null)
NetworkCapabilities nc = cm.getNetworkCapabilities(cm.getActiveNetwork());
return nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
return false;
【讨论】:
【参考方案20】:package com.base64;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Base64;
import android.widget.ImageView;
import android.widget.Toast;
import com.androidquery.AQuery;
public class MainActivity extends AppCompatActivity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(isConnectingToInternet(MainActivity.this))
Toast.makeText(getApplicationContext(),"internet is available",Toast.LENGTH_LONG).show();
else
System.out.print("internet is not available");
public static boolean isConnectingToInternet(Context context)
ConnectivityManager connectivity =
(ConnectivityManager) context.getSystemService(
Context.CONNECTIVITY_SERVICE);
if (connectivity != null)
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null)
for (int i = 0; i < info.length; i++)
if (info[i].getState() == NetworkInfo.State.CONNECTED)
return true;
return false;
/* manifest */
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.base64">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
【讨论】:
【参考方案21】:使用ConnectivityManager服务
来源Link
...
...
import android.net.ConnectivityManager;
....
....
public class Utils
static ConnectivityManager connectivityManager;
....
....
public static String isOnline(Context context)
JSONArray array = new JSONArray();
JSONObject jsonObject = new JSONObject();
try
jsonObject.put("connected","false");
catch (JSONException e)
e.printStackTrace();
try
connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
Log.i("networkInfo", networkInfo.toString());
jsonObject.put("connected",(networkInfo != null && networkInfo.isAvailable() &&
networkInfo.isConnected()));
jsonObject.put("isAvailable",(networkInfo.isAvailable()));
jsonObject.put("isConnected",(networkInfo.isConnected()));
jsonObject.put("typeName",(networkInfo.getTypeName()));
array.put(jsonObject);
return array.toString();
catch (Exception e)
System.out.println("CheckConnectivity Exception: " + e.getMessage());
Log.v("connectivity", e.toString());
array.put(jsonObject);
return array.toString();
【讨论】:
以上是关于如何在android中检查当前的互联网连接是不是可用的主要内容,如果未能解决你的问题,请参考以下文章
如何在android中检查网络是不是连接到wifi [重复]
在整个应用程序中检查 android studio 中的互联网连接。 (我们是不是需要在每个 java 活动中编写连接管理器函数?) [重复]