检查活动的互联网连接 Android

Posted

技术标签:

【中文标题】检查活动的互联网连接 Android【英文标题】:Check for Active internet connection Android 【发布时间】:2013-07-17 01:35:28 【问题描述】:

我正在尝试在我的应用程序中编写一个部分,以区分活动 Wifi 连接和互联网的实际连接。使用连接管理器确定是否有活动的 Wifi 连接非常简单,但是每次我尝试测试在连接 Wifi 但没有互联网连接时是否可以连接到网站时,我最终会陷入无限循环。 我曾尝试 ping 谷歌,但结果相同:

Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
int returnVal = 5;
try 
    returnVal = p1.waitFor();
 catch (InterruptedException e) 
    e.printStackTrace();

boolean reachable = (returnVal==0);
return reachable;

我也试过这段代码:

if (InetAddress.getByName("www.xy.com").isReachable(timeout))
    
else
    

但我无法让 isReachable 工作。

【问题讨论】:

查看问题***.com/questions/4238921/… 【参考方案1】:

我用这个:

public static void isNetworkAvailable(Context context)
    HttpGet httpGet = new HttpGet("http://www.google.com");
    HttpParams httpParameters = new BasicHttpParams();
    // Set the timeout in milliseconds until a connection is established.
    // The default value is zero, that means the timeout is not used.
    int timeoutConnection = 3000;
    HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
    // Set the default socket timeout (SO_TIMEOUT)
    // in milliseconds which is the timeout for waiting for data.
    int timeoutSocket = 5000;
    HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

    DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
    try
        Log.d(TAG, "Checking network connection...");
        httpClient.execute(httpGet);
        Log.d(TAG, "Connection OK");
        return;
    
    catch(ClientProtocolException e)
        e.printStackTrace();
    
    catch(IOException e)
        e.printStackTrace();
    

    Log.d(TAG, "Connection unavailable");

它来自另一个 *** 答案,但我找不到。

编辑:

终于找到了:https://***.com/a/1565243/2198638

【讨论】:

如果我 timeoutConnection = 2000 和 int timeoutSocket = 3000;【参考方案2】:

这样查询一个网站:

通过将以下方法添加到您的类中,让您的类实现 AsyncTaskCompleteListenere<Boolean>

@Override
public void onTaskComplete(Boolean result) 
    Toast.makeText(getApplicationContext(), "URL Exist:" + result, Toast.LENGTH_LONG).show();
   // continue your job

向您的类添加一个简单的testConnection 方法,以便在您要检查连接时调用:

public void testConnection() 
        URLExistAsyncTask task = new URLExistAsyncTask(this);
        String URL = "http://www.google.com";
        task.execute(new String[]URL);
    

最后是 URLExistAsyncTask 类,它作为异步(后台)任务执行连接测试,并在完成后回调您的 onTaskComplete 方法:

  public class URLExistAsyncTask extends AsyncTask<String, Void, Boolean> 
        AsyncTaskCompleteListenere<Boolean> callback;

        public URLExistAsyncTask(AsyncTaskCompleteListenere<Boolean> callback) 
            this.callback = callback;
        

        protected Boolean doInBackground(String... params) 
            int code = 0;
            try 
                URL u = new URL(params[0]);
                HttpURLConnection huc = (HttpURLConnection) u.openConnection();
                huc.setRequestMethod("GET");
                huc.connect();
                code = huc.getResponseCode();
             catch (IOException e) 
                return false;
             catch (Exception e) 
                return false;
            

            return code == 200;
        

        protected void onPostExecute(Boolean result)
              callback.onTaskComplete(result);
        
    

【讨论】:

【参考方案3】:

它确实对我有用:

验证网络可用性:

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

验证互联网访问:

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;

【讨论】:

警告使用 ping 方法!这在我测试过的大多数设备上都很好用,但在 S4 Mini 上就不行了。 具体是哪个异常? 这有时会冻结 UI,因为它在 UI 线程上运行。【参考方案4】:

为了检查 android 设备是否有活动连接,我使用下面的 hasActiveInternetConnection() 方法(1)尝试检测网络是否可用,(2)然后连接到 google.com 以确定网络是否可用活跃。

public static boolean hasActiveInternetConnection(Context context) 
    if (isNetworkAvailable(context)) 
        if (connectGoogle()) 
            return true;
         else  //one more try
            return connectGoogle();
           
     else 
        log("No network available! (in hasActiveInternetConnection())");
        return false;
    



public static boolean isNetworkAvailable(Context ct) 
    ConnectivityManager connectivityManager = (ConnectivityManager) ct.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null;



public static boolean connectGoogle() 
    try 
        HttpURLConnection urlc = (HttpURLConnection)(new URL("http://www.google.com").openConnection());
        urlc.setRequestProperty("User-Agent", "Test");
        urlc.setRequestProperty("Connection", "close");
        urlc.setConnectTimeout(10000); 
        urlc.connect();
        return (urlc.getResponseCode() == 200);     
     catch (IOException e) 
        log("IOException in connectGoogle())");
        return false;
    

【讨论】:

【参考方案5】:

这里有一些现代代码使用AsynTask 来解决当您尝试在主线程上连接时 android 崩溃的问题,并为用户引入带有冲洗和重复选项的警报。

class TestInternet extends AsyncTask<Void, Void, Boolean> 
    @Override
    protected Boolean doInBackground(Void... params) 
        try 
            URL url = new URL("http://www.google.com");
            HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
            urlc.setConnectTimeout(3000);
            urlc.connect();
            if (urlc.getResponseCode() == 200) 
                return true;
            
         catch (MalformedURLException e1) 
            // TODO Auto-generated catch block
            e1.printStackTrace();
            return false;
         catch (IOException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        
        return false;
    

    @Override
    protected void onPostExecute(Boolean result) 
        if (!result)  // code if not connected
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setMessage("An internet connection is required.");
            builder.setCancelable(false);

            builder.setPositiveButton(
                    "TRY AGAIN",
                    new DialogInterface.OnClickListener() 
                        public void onClick(DialogInterface dialog, int id) 
                            dialog.cancel();
                            new TestInternet().execute();
                        
                    );


            AlertDialog alert11 = builder.create();
            alert11.show();
         else  // code if connected
            doMyStuff();
        
    

...

new TestInternet().execute();

【讨论】:

这很好,但是如果有 WiFi 连接而无法访问互联网,则需要很长时间,有什么解决方法吗?【参考方案6】:

我确实使用了这种方法。它对我有用!适合想要真正上网的人!

public boolean isOnline() 
    try 
        HttpURLConnection httpURLConnection = (HttpURLConnection)(new URL("http://www.google.com").openConnection());
        httpURLConnection.setRequestProperty("User-Agent", "Test");
        httpURLConnection.setRequestProperty("Connection", "close");
        httpURLConnection.setConnectTimeout(10000);
        httpURLConnection.connect();
        return (httpURLConnection.getResponseCode() == 200);
     catch (IOException e) 
        e.printStackTrace();
        return false;
    

每次都这样做!只需使用接收器 和=&gt;

httpURLConnection.getResponseCode() == 200 

这意味着互联网已连接!

【讨论】:

为了改进这个答案,我会注意到 connect 不能从主线程调用,setReadTimeout 也很好。【参考方案7】:

您可以通过创建 new parallel thread 来计算时间:

final class QueryClass 
    private int responseCode = -1;
     private   String makeHttpRequest(URL url) throws IOException 
            String jsonResponse = "";
            if(url == null) 
                return null;
            

            HttpURLConnection  urlConnection = null;
            InputStream inputStream = null;
            try 
                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setRequestMethod("GET");
                urlConnection.setReadTimeout(5000 );
                urlConnection.setConnectTimeout(5000 );
                Thread thread = new Thread() 
                    @Override
                    public void run() 
                        super.run();
                        try 
                            sleep(5000);
                         catch (InterruptedException e) 
                            e.printStackTrace();
                        
                        if(responseCode == -1) 
                            //Perform error message
                        Intent intent = new Intent(context,ErrorsActivity.class);
                        intent.putExtra("errorTextMessage",R.string.errorNoInternet);
                        intent.putExtra("errorImage",R.drawable.no_wifi);
                        context.startActivity(intent);
                        
                    
                ;
                thread.start();
                urlConnection.connect();
                 responseCode = urlConnection.getResponseCode();
                if (responseCode == 200) 
                    inputStream = urlConnection.getInputStream();
                    jsonResponse = readFromStream(inputStream);

                

【讨论】:

以上是关于检查活动的互联网连接 Android的主要内容,如果未能解决你的问题,请参考以下文章

如何关闭android活动中的警报?

你如何检查android中的互联网连接? [复制]

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

从主要活动检查互联网状态

用户按下后退按钮后检查互联网连接。(Android的警报框)

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