如何在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 活动中编写连接管理器函数?) [重复]

Android - 检查用户连接的连接是不是有互联网连接[重复]

android根据互联网连接更改视图

从服务器检查 Android 设备是不是在线

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