代码之家  ›  专栏  ›  技术社区  ›  Vidar Vestnes

如何在Android上检查互联网接入?地址从不超时

  •  603
  • Vidar Vestnes  · 技术社区  · 15 年前

    我有一个 AsyncTask 它应该检查对主机名的网络访问。但是 doInBackground() 永远不会超时。有人有线索吗?

    public class HostAvailabilityTask extends AsyncTask<String, Void, Boolean> {
    
        private Main main;
    
        public HostAvailabilityTask(Main main) {
            this.main = main;
        }
    
        protected Boolean doInBackground(String... params) {
            Main.Log("doInBackground() isHostAvailable():"+params[0]);
    
            try {
                return InetAddress.getByName(params[0]).isReachable(30); 
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return false;       
        }
    
        protected void onPostExecute(Boolean... result) {
            Main.Log("onPostExecute()");
    
            if(result[0] == false) {
                main.setContentView(R.layout.splash);
                return;
            }
    
            main.continueAfterHostCheck();
        }   
    }
    
    49 回复  |  直到 3 年前
        1
  •  1038
  •   Bhargav Rao Ankit    6 年前

    如果设备处于飞行模式(或者可能在没有可用网络的其他情况下), cm.getActiveNetworkInfo() null ,因此您需要添加一个 无效的 检查

    修改( Eddie's solution )下:

    public boolean isOnline() {
        ConnectivityManager cm =
            (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        return netInfo != null && netInfo.isConnectedOrConnecting();
    }
    

    AndroidManifest.xml :

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    

    netInfo.isConnected() 而不是 netInfo.isConnectedOrConnecting

        2
  •  628
  •   Aryeetey Solomon Aryeetey    3 年前

    网络连接/互联网接入

    • isConnectedOrConnecting() (用于大多数答案)检查是否有 网络 联系
    • 要知道这些网络中是否有 互联网

    A) Ping服务器(简单)

    // ICMP 
    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;
    }
    

    + 可以在主线程上运行

    - 在一些旧设备(Galays S3等)上不工作,如果没有可用的internet,它会阻塞一段时间。

    B) 连接到Internet上的插座(高级)

    // TCP/HTTP/DNS (depending on the port, 53=DNS, 80=HTTP, etc.)
    public boolean isOnline() {
        try {
            int timeoutMs = 1500;
            Socket sock = new Socket();
            SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53);
    
            sock.connect(sockaddr, timeoutMs);
            sock.close();
    
            return true;
        } catch (IOException e) { return false; }
    }
    

    非常快(无论哪种方式),适用于所有设备, 非常 可信赖的

    -

    这在每台设备上都能非常可靠地工作,而且速度非常快。但它需要在单独的任务中运行(例如。 ScheduledExecutorService AsyncTask ).

    • 它真的够快吗?

      是的,非常快;-)

    • 除了在互联网上测试之外,没有可靠的方法来检查互联网吗?

    • 如果DNS关闭了怎么办?

      谷歌DNS(例如。 8.8.8.8 1 ].这么说吧,你的应用程序可能不会成为热门话题。

    • 需要哪些权限?

      <uses-permission android:name="android.permission.INTERNET" />
      

    额外:一次 RxJava/RxAndroid 示例(科特林)

    fun hasInternetConnection(): Single<Boolean> {
      return Single.fromCallable {
        try {
          // Connect to Google DNS to check for connection
          val timeoutMs = 1500
          val socket = Socket()
          val socketAddress = InetSocketAddress("8.8.8.8", 53)
        
          socket.connect(socketAddress, timeoutMs)
          socket.close()
      
          true
        } catch (e: IOException) {
          false
        }
      }
      .subscribeOn(Schedulers.io())
      .observeOn(AndroidSchedulers.mainThread())
    }
    
    ///////////////////////////////////////////////////////////////////////////////////
    // Usage
    
        hasInternetConnection().subscribe { hasInternet -> /* do something */}
    

    额外:一次 RxJava/RxAndroid 示例(Java)

    public static Single<Boolean> hasInternetConnection() {
        return Single.fromCallable(() -> {
            try {
                // Connect to Google DNS to check for connection
                int timeoutMs = 1500;
                Socket socket = new Socket();
                InetSocketAddress socketAddress = new InetSocketAddress("8.8.8.8", 53);
    
                socket.connect(socketAddress, timeoutMs);
                socket.close();
    
                return true;
            } catch (IOException e) {
                return false;
            }
        }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
    }
    
    ///////////////////////////////////////////////////////////////////////////////////
    // Usage
    
        hasInternetConnection().subscribe((hasInternet) -> {
            if(hasInternet) {
    
            }else {
    
            }
        });
    

    实例

    警告: 已弃用,应替换为应用程序的线程调度、Kotlin协程、Rx、。。。

    class InternetCheck extends AsyncTask<Void,Void,Boolean> {
    
        private Consumer mConsumer;
        public  interface Consumer { void accept(Boolean internet); }
    
        public  InternetCheck(Consumer consumer) { mConsumer = consumer; execute(); }
    
        @Override protected Boolean doInBackground(Void... voids) { try {
            Socket sock = new Socket();
            sock.connect(new InetSocketAddress("8.8.8.8", 53), 1500);
            sock.close();
            return true;
        } catch (IOException e) { return false; } }
    
        @Override protected void onPostExecute(Boolean internet) { mConsumer.accept(internet); }
    }
    
    ///////////////////////////////////////////////////////////////////////////////////
    // Usage
    
        new InternetCheck(internet -> { /* do something with boolean response */ });
    
        3
  •  297
  •   Jeff Axelrod    12 年前

    不需要太复杂。最简单的框架方式是使用 ACCESS_NETWORK_STATE

    public boolean isOnline() {
        ConnectivityManager cm =
            (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    
        return cm.getActiveNetworkInfo() != null && 
           cm.getActiveNetworkInfo().isConnectedOrConnecting();
    }
    

    你也可以使用 requestRouteToHost 如果您有特定的主机和连接类型(wifi/mobile)。

    您还需要:

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    

    在你的android清单中。

        4
  •  64
  •   Jeff Axelrod    12 年前

    getActiveNetworkInfo() 要工作,您需要将以下内容添加到清单中。

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
        5
  •  47
  •   Freewind thk    12 年前

    请看一下ConnectivityManager类。您可以使用此类获取主机上活动连接的信息。 http://developer.android.com/reference/android/net/ConnectivityManager.html

    编辑:您可以使用

    Context.getSystemService(Context.CONNECTIVITY_SERVICE)
        .getNetworkInfo(ConnectivityManager.TYPE_MOBILE) 
    

    Context.getSystemService(Context.CONNECTIVITY_SERVICE)
        .getNetworkInfo(ConnectivityManager.TYPE_WIFI) 
    

    并解析返回的NetworkInfo对象的DetailedState枚举

    编辑:要确定是否可以访问主机,可以使用

    Context.getSystemService(Context.CONNECTIVITY_SERVICE)
        .requestRouteToHost(TYPE_WIFI, int hostAddress)
    

    ConnectivityManager cm = Context.getSystemService(Context.CONNECTIVITY_SERVICE);
    cm.yourMethodCallHere();
    
        6
  •  47
  •   Melquiades Mohsen mokhtari    11 年前

    检查此代码。。。这对我很有效:)

    public static void isNetworkAvailable(final Handler handler, final int timeout) {
        // ask fo message '0' (not connected) or '1' (connected) on 'handler'
        // the answer must be send before before within the 'timeout' (in milliseconds)
    
        new Thread() {
            private boolean responded = false;   
            @Override
            public void run() { 
                // set 'responded' to TRUE if is able to connect with google mobile (responds fast) 
                new Thread() {      
                    @Override
                    public void run() {
                        HttpGet requestForTest = new HttpGet("http://m.google.com");
                        try {
                            new DefaultHttpClient().execute(requestForTest); // can last...
                            responded = true;
                        } 
                        catch (Exception e) {
                        }
                    } 
                }.start();
    
                try {
                    int waited = 0;
                    while(!responded && (waited < timeout)) {
                        sleep(100);
                        if(!responded ) { 
                            waited += 100;
                        }
                    }
                } 
                catch(InterruptedException e) {} // do nothing 
                finally { 
                    if (!responded) { handler.sendEmptyMessage(0); } 
                    else { handler.sendEmptyMessage(1); }
                }
            }
        }.start();
    }
    

    然后,我定义处理程序:

    Handler h = new Handler() {
        @Override
        public void handleMessage(Message msg) {
    
            if (msg.what != 1) { // code if not connected
    
            } else { // code if connected
    
            }   
        }
    };
    

    …并启动测试:

    isNetworkAvailable(h,2000); // get the answser within 2000 ms
    
        7
  •  27
  •   Vladtn    14 年前

    在处找到并从此处修改(!) link

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    

    如果您正在访问INTERNET,您可能已经拥有INTERNET权限。然后,允许测试连接性的布尔函数是:

    private boolean checkInternetConnection() {
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        // test for connection
        if (cm.getActiveNetworkInfo() != null
                && cm.getActiveNetworkInfo().isAvailable()
                && cm.getActiveNetworkInfo().isConnected()) {
            return true;
        } else {
            Log.v(TAG, "Internet Connection Not Present");
            return false;
        }
    }
    
        8
  •  18
  •   Dediqated Munish Katoch    11 年前

    if(isOnline()){

    您将获得是否存在连接以及是否可以连接到页面的状态代码 200 (稳定连接)。

    确保添加正确的 INTERNET ACCESS_NETWORK_STATE

    public boolean isOnline() {
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        if (netInfo != null && netInfo.isConnected()) {
            try {
                URL url = new URL("http://www.google.com");
                HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
                urlc.setConnectTimeout(3000);
                urlc.connect();
                if (urlc.getResponseCode() == 200) {
                    return new Boolean(true);
                }
            } catch (MalformedURLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return false;
    }
    
        9
  •  13
  •   Musculaa    10 年前

    它确实对我有用:

    private Boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager 
          = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting();}
    

    要验证internet访问,请执行以下操作:

    public Boolean isOnline() {
        try {
            Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
            int returnVal = p1.waitFor();
            boolean reachable = (returnVal==0);
            return reachable;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return false;
    }
    
        10
  •  13
  •   Mohamed Embaby    7 年前

    有不止一种方法

    第一,最短但效率低的方法

    仅需要网络状态权限

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    

    那么这个方法,,

     public boolean activeNetwork () {
            ConnectivityManager cm =
                    (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            boolean isConnected = activeNetwork != null &&
                    activeNetwork.isConnected();
    
            return isConnected;
    
        }
    

    如答案所示 ConnectivityManager 这是一个解决方案,我只是在一个方法中添加了它。这是一个简化的方法
    连接管理器 如果存在网络接入而非互联网接入,则返回true。这意味着如果您的WiFi连接到路由器,但路由器没有互联网,则返回true,并检查连接可用性

    第二,有效途径

    需要网络状态和Internet权限

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    

    然后这个班,,

     public class CheckInternetAsyncTask extends AsyncTask<Void, Integer, Boolean> {
    
            private Context context;
    
            public CheckInternetAsyncTask(Context context) {
                this.context = context;
            }
    
            @Override
            protected Boolean doInBackground(Void... params) {
    
                ConnectivityManager cm =
                        (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    
                assert cm != null;
                NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
                boolean isConnected = activeNetwork != null &&
                        activeNetwork.isConnected();
    
    
                if (isConnected) {
                    try {
                        HttpURLConnection urlc = (HttpURLConnection)
                                (new URL("http://clients3.google.com/generate_204")
                                        .openConnection());
                        urlc.setRequestProperty("User-Agent", "Android");
                        urlc.setRequestProperty("Connection", "close");
                        urlc.setConnectTimeout(1500);
                        urlc.connect();
                        if (urlc.getResponseCode() == 204 &&
                                urlc.getContentLength() == 0)
                            return true;
    
                    } catch (IOException e) {
                        Log.e("TAG", "Error checking internet connection", e);
                        return false;
                    }
                } else {
                    Log.d("TAG", "No network available!");
                    return false;
                }
    
    
                return null;
            }
    
            @Override
            protected void onPostExecute(Boolean result) {
                super.onPostExecute(result);
                Log.d("TAG", "result" + result);
    
                if(result){
                    // do ur code
                }
    
            }
    
    
        }
    

    CheckInternetAsyncTask

    new CheckInternetAsyncTask(getApplicationContext()).execute();
    

    • 你必须上网 AsyncTask ,否则它会抛出 android.os.NetworkOnMainThreadException

    • 连接管理器 用于在true发送请求(Ping)时检查网络访问

    • http://clients3.google.com/generate_204 ,这个众所周知的URL会返回一个HTTP状态为204的空页面。这比 http://www.google.com 阅读 this . 如果你有一个网站,你最好把你的网站,而不是谷歌,只有当你在应用程序中使用它

        11
  •  9
  •   Community kfsone    7 年前

    以下是我使用的方法:

    public boolean isNetworkAvailable(final Context context) {
        return ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo() != null;
    }
    

    public boolean isNetworkAvailable(final Context context) {
        final ConnectivityManager connectivityManager = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE));
        return connectivityManager.getActiveNetworkInfo() != null && connectivityManager.getActiveNetworkInfo().isConnected();
    }
    

    以下是如何使用该方法:

    if (isNetworkAvailable(context)) {
        // code here
    } else {
        // code
    }
    

    所需许可:

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    

    https://stackoverflow.com/a/16124915/950427

        12
  •  8
  •   Nickolaus    12 年前

    到目前为止,我所看到的最短、最干净的方法应该是:

    public final static boolean isConnected( Context context )
    {   
       final ConnectivityManager connectivityManager = 
             (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE );  
       final NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();    
       return networkInfo != null && networkInfo.isConnected();
    }
    

    PS:这不会ping任何主机,它只是检查连接状态,因此,如果您的路由器没有internet连接,并且您的设备已连接到它,则此方法将返回 虽然你没有互联网。
    对于实际测试,我建议执行HttpHead请求 (例如,访问www.google.com) 并检查状态,如果 200行 一切正常,您的设备已连接互联网。

        13
  •  8
  •   user1528493    11 年前

    移动设备上的一个重要用例是确保存在实际连接。当移动用户进入带有“专属门户”的Wifi网络时,这是一个常见问题,他们需要在其中登录。我在后台使用这个阻塞函数来确保连接存在。

    /*
     * Not Thread safe. Blocking thread. Returns true if it
     * can connect to URL, false and exception is logged.
     */
    public boolean checkConnectionHttps(String url){
        boolean responded = false;
        HttpGet requestTest = new HttpGet(url);
        HttpParams params = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(params, 3000);
        HttpConnectionParams.setSoTimeout(params, 5000);
        DefaultHttpClient client = new DefaultHttpClient(params);
        try {
            client.execute(requestTest);
            responded = true;
        } catch (ClientProtocolException e) {
            Log.w(MainActivity.TAG,"Unable to connect to " + url + " " + e.toString());
        } catch (IOException e) {
            Log.w(MainActivity.TAG,"Unable to connect to " + url + " " + e.toString());
            e.printStackTrace();
        }
        return responded;
    }
    
        14
  •  7
  •   Hawklike    4 年前

    科特林与合作项目

    ViewModel ,其中 viewModelScope LiveData 我通知一个活动有关连接。

    视图模型

     fun checkInternetConnection(timeoutMs: Int) {
            viewModelScope.launch(Dispatchers.IO) {
                try {
                    val socket = Socket()
                    val socketAddress = InetSocketAddress("8.8.8.8", 53)
    
                    socket.connect(socketAddress, timeoutMs)
                    socket.close()
    
                    _connection.postValue(true)
                }
                catch(ex: IOException) {
                    _connection.postValue(false)
                }
            }
        }
    
     private val _connection = MutableLiveData<Boolean>()
     val connection: LiveData<Boolean> = _connection
    

    活动

     private fun checkInternetConnection() {
         viewModel.connection.observe(this) { hasInternet ->
             if(!hasInternet) {
                 //hasn't connection
             }
             else {
                //has connection
             }
         }
      }
    
        15
  •  6
  •   Vidar Vestnes    15 年前

    Im使用此代码而不是InetAddress:

        try {
    
            URL url = new URL("http://"+params[0]);
    
            HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
            urlc.setRequestProperty("User-Agent", "Android Application:"+Z.APP_VERSION);
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(1000 * 30); // mTimeout is in seconds
            urlc.connect();
            if (urlc.getResponseCode() == 200) {
                Main.Log("getResponseCode == 200");
                return new Boolean(true);
            }
        } catch (MalformedURLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
        16
  •  6
  •   Emre Yazici    13 年前

    您可以迭代所有网络连接,并检查是否至少有一个可用连接:

    public boolean isConnected() {
        boolean connected = false;
    
        ConnectivityManager cm = 
            (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    
        if (cm != null) {
            NetworkInfo[] netInfo = cm.getAllNetworkInfo();
    
            for (NetworkInfo ni : netInfo) {
                if ((ni.getTypeName().equalsIgnoreCase("WIFI")
                        || ni.getTypeName().equalsIgnoreCase("MOBILE"))
                        && ni.isConnected() && ni.isAvailable()) {
                    connected = true;
                }
    
            }
        }
    
        return connected;
    }
    
        17
  •  6
  •   laplasz    12 年前

    ConnectivityManager cm =
        (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    

    应该在那里调用,或者您需要将活动实例(上下文)下推到连接处理程序类,以便能够检查那里的连接状态 未知后异常

    JSONObject jObj = null;
    Boolean responded = false;
    HttpGet requestForTest = new HttpGet("http://myserver.com");
    try {
        new DefaultHttpClient().execute(requestForTest);
        responded = true;
    } catch (UnknownHostException e) {
        jObj = new JSONObject();
        try {
            jObj.put("answer_code", 1);
            jObj.put("answer_text", "No available connection");
        } catch (Exception e1) {}
        return jObj;
    } catch (IOException e) {
        e.printStackTrace();
    }
    

    通过这种方式,我可以处理这个案例以及同一类中的其他案例(我的服务器总是使用json字符串进行响应)

        18
  •  6
  •   selva_pollachi    11 年前

    这对我很有用。试试看。

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        try {
            URL url = new URL("http://stackoverflow.com/posts/11642475/edit" );
            //URL url = new URL("http://www.nofoundwebsite.com/" );
            executeReq(url);
            Toast.makeText(getApplicationContext(), "Webpage is available!", Toast.LENGTH_SHORT).show();
        }
        catch(Exception e) {
            Toast.makeText(getApplicationContext(), "oops! webpage is not available!", Toast.LENGTH_SHORT).show();
        }
    }
    
    private void executeReq(URL urlObject) throws IOException
    {
        HttpURLConnection conn = null;
        conn = (HttpURLConnection) urlObject.openConnection();
        conn.setReadTimeout(30000);//milliseconds
        conn.setConnectTimeout(3500);//milliseconds
        conn.setRequestMethod("GET");
        conn.setDoInput(true);
    
        // Start connect
        conn.connect();
        InputStream response =conn.getInputStream();
        Log.d("Response:", response.toString());
    }}
    
        19
  •  6
  •   WonderWorker Sakal    9 年前

    public boolean isNetworkAvailable(bool SlowButMoreReliable) {
        bool Result = false; 
        try {
            if(SlowButMoreReliable){
                ConnectivityManager MyConnectivityManager = null;
                MyConnectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    
                NetworkInfo MyNetworkInfo = null;
                MyNetworkInfo = MyConnectivityManager.getActiveNetworkInfo();
    
                Result = MyNetworkInfo != null && MyNetworkInfo.isConnected();
    
            } else
            {
                Runtime runtime = Runtime.getRuntime();
                Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
    
                int i = ipProcess.waitFor();
    
                Result = i== 0;
    
            }
    
        } catch(Exception ex)
        {
            //Common.Exception(ex); //This method is one you should have that displays exceptions in your log
        }
        return Result;
    }
    
        20
  •  5
  •   Chilledrat Engr.Ammad    12 年前

    检查Android网络/互联网连接状态并不复杂。下面 DetectConnection

    import android.content.Context;
    import android.net.ConnectivityManager;
    
    public class DetectConnection {
        public static boolean checkInternetConnection(Context context) {
            ConnectivityManager con_manager = (ConnectivityManager) context
                                    .getSystemService(Context.CONNECTIVITY_SERVICE);
    
            if (con_manager.getActiveNetworkInfo() != null
                && con_manager.getActiveNetworkInfo().isAvailable()
                && con_manager.getActiveNetworkInfo().isConnected()) {
                    return true;
            } else {
                return false;
            }
        }
    }
    

    欲了解更多详情,请访问 How to Check Android Network / Internet Connectivity Status

        21
  •  5
  •   Lo Juego    12 年前

    public static boolean isOnline() {
        try {
        InetAddress.getByName("google.com").isReachable(3);
    
        return true;
        } catch (UnknownHostException e){
        return false;
        } catch (IOException e){
        return false;
        }
        }
    
        22
  •  5
  •   Mahendra Liya    11 年前

    Utils 类别:

    public static boolean isNetworkAvailable(Context context) {
            ConnectivityManager connectivityManager 
                  = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
            return activeNetworkInfo != null && activeNetworkInfo.isConnected();
    }
    
        23
  •  5
  •   kleopatra Aji kattacherry    11 年前
    public class Network {
    
    Context context;
    
    public Network(Context context){
        this.context = context;
    }
    
    public boolean isOnline() {
        ConnectivityManager cm =
                (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        return activeNetwork != null &&
                              activeNetwork.isConnectedOrConnecting();
    }
    
    }
    
        24
  •  5
  •   Akshay Paliwal    10 年前

    您可以使用此方法检测网络可用性-

    public static boolean isDeviceOnline(Context context) {
            boolean isConnectionAvail = false;
            try {
                ConnectivityManager cm = (ConnectivityManager) context
                        .getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo netInfo = cm.getActiveNetworkInfo();
                return netInfo.isConnected();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return isConnectionAvail;
        }
    
        26
  •  5
  •   Jorgesys    8 年前

    非常重要的是检查我们是否与 isAvailable() 如果可能的话,可以与 isConnected()

    private static ConnectivityManager manager;
    
    public static boolean isOnline(Context context) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        return networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected();
    }
    

    您可以终止网络活动的类型 WiFi

    public static boolean isConnectedWifi(Context context) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        return networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI;
    }
    

    还是手机 Móvil :

    public static boolean isConnectedMobile(Context context) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        return networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_MOBILE;
    }
    

        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
       <uses-permission android:name="android.permission.INTERNET" />
    
        27
  •  5
  •   Jaymin Panchal Orxan Kerimli    8 年前

    我已经应用了@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
    }
    
        28
  •  4
  •   miguel    9 年前

    使用ConnectivityManager的其他答案是错误的,因为拥有网络连接并不意味着您可以访问internet。例如,用户可能连接到咖啡店的WiFi门户,但无法访问互联网。要检查internet是否可访问,您必须尝试连接到实际的服务器。通常,当您想这样做时,您会想到要连接到的特定服务器,因此请继续检查您是否可以连接到该服务器。这里有一个检查服务器连接的简单方法。

    private boolean isOnTheInternet() {
        try {
            URLConnection urlConnection = new URL("http://yourserver").openConnection();
            urlConnection.setConnectTimeout(400);
            urlConnection.connect();
            return true;
        } catch (Exception e) {
            return false;
        }
    }
    

    设置ConnectTimeout的原因是,否则它默认为TCP超时,可能长达数秒。

    另外请注意,Android不允许您在主线程上运行此功能。

        29
  •  4
  •   Rajesh Jadav    8 年前

    我已经看完了所有的答案,我提出了我自己的答案,首先检查互联网是否可用,如果互联网可用,然后检查它是否处于活动状态。

    我已经包括了所有必要的方法和类来检查活动的互联网连接。

    NetworkUtils.class

    public class NetworkUtils {
    
        public static final int STATUS_CONNECTED = 0 ;
    
        public static boolean isInternetAvailable(Context ctx){
            ConnectivityManager cm = (ConnectivityManager)ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
        }
    
        public static int isInternetActiveWithPing() {
            try {
                Runtime runtime = Runtime.getRuntime();
                Process process = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
                int exitValue = process.waitFor();
                return exitValue;
            } catch (Exception ex) {
                return -1;
            }
        }
    
        public static boolean isInternetActiveWithInetAddress() {
            try {
                InetAddress inetAddress = InetAddress.getByName("www.google.com");
                return inetAddress != null && !inetAddress.toString().equals("");
            } catch (Exception ex) {
                return false;
            }
        }
    
        public static void displayInternetConnectionMessage(Context ctx){
            Toast.makeText(ctx, "Check Internet Connection", Toast.LENGTH_SHORT).show();
        }
    }
    

    您可以使用以下代码检查Internet是否处于活动状态:

     private void checkInternetConnection() {
            if (NetworkUtils.isInternetAvailable(this)) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        if (NetworkUtils.isInternetActiveWithPing() == NetworkUtils.STATUS_CONNECTED) {
                            performNetworkingOperations();
                        } else {
                            if (NetworkUtils.isInternetActiveWithInetAddress()) {
                                performNetworkingOperations();
                            } else {
                                displayConnectionMessage();
                            }
                        }
                    }
                }).start();
    
            } else {
                displayConnectionMessage();
            }
        }
    
        private void performNetworkingOperations() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(MainActivity.this, "Internet is Available", Toast.LENGTH_SHORT).show();
                }
            });
        }
    
        private void displayConnectionMessage() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    NetworkUtils.displayInternetConnectionMessage(MainActivity.this);
                }
            });
        }
    
        30
  •  3
  •   Michele La Ferla    10 年前

    public class ConnectionStatus {
    
        private Context _context;
    
        public ConnectionStatus(Context context) {
            this._context = context;
        }
    
        public boolean isConnectionAvailable() {
            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;
        }
    }
    

    true 否则 false

    然后,MainActivity中的以下方法调用前面描述的方法的结果,并提示用户采取相应的行动:

    public void addListenerOnWifiButton() {
            Button btnWifi = (Button)findViewById(R.id.btnWifi);
    
            iia = new ConnectionStatus(getApplicationContext());
    
            isConnected = iia.isConnectionAvailable();
            if (!isConnected) {
                btnWifi.setOnClickListener(new View.OnClickListener() {
    
                    @Override
                    public void onClick(View v) {
                        startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
                        Toast.makeText(getBaseContext(), "Please connect to a hotspot",
                                Toast.LENGTH_SHORT).show();
                    }
                });
            }
            else {
                btnWifi.setVisibility(4);
                warning.setText("This app may use your mobile data to update events and get their details.");
            }
        }
    

    在上面的代码中,如果结果为false(因此没有互联网连接),用户将被带到Android wi-fi面板,在那里他将被提示连接到wi-fi热点。