【问题标题】: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(); 
} 

谢谢

【问题讨论】:

    标签: android internet-connection


    【解决方案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 字节文本文件。

    【讨论】:

    • 感谢您的帖子,欢迎来到 Stackoverflow。作为仅供参考,您不应在此处的帖子中包含签名。
    【解决方案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();
                                }
                            
                            }
                            

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2017-06-07
                              • 1970-01-01
                              • 2021-10-30
                              • 2019-09-03
                              • 1970-01-01
                              • 1970-01-01
                              相关资源
                              最近更新 更多