2013-07-18 7 views
12

मैं अपने ऐप में एक हिस्सा लिखने की कोशिश कर रहा हूं जो एक सक्रिय वाईफाई कनेक्शन और इंटरनेट से वास्तविक कनेक्शन के बीच अंतर करेगा। यह पता लगाना कि कोई सक्रिय वाईफाई कनेक्शन कनेक्शन मैनेजर का उपयोग करके बहुत आसान है, हालांकि हर बार जब मैं परीक्षण करने की कोशिश करता हूं कि वाईफ़ाई कनेक्ट होने पर मैं किसी वेबसाइट से कनेक्ट कर सकता हूं लेकिन कोई इंटरनेट कनेक्शन नहीं है तो मैं अनंत लूप में समाप्त होता हूं।
मैं पिंग गूगल की कोशिश की है लेकिन यह समाप्त होता है उसी तरह:सक्रिय इंटरनेट कनेक्शन के लिए जांचें एंड्रॉइड

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 नहीं मिल सका।

+0

प्रश्न देखें https://stackoverflow.com/questions/4238921/detect-whether-there-is-an-internet-connection-available-on-android – nyulan

उत्तर

10

मैं इस का उपयोग करें:

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"); 
} 

यह एक अन्य stackoverflow जवाब से आता है, लेकिन मैं यह नहीं मिल सकता है।

संपादित करें: https://stackoverflow.com/a/1565243/2198638

+0

क्या होगा यदि मैं टाइमआउट कनेक्शन = 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 विधि जोड़ें nectivity:

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); 
     } 
    } 
23

यह मेरे लिए काम करता है करता है:

नेटवर्क उपलब्धता को सत्यापित करने के लिए:

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; 
} 
+2

पिंग-विधि का उपयोग कर चेतावनी! यह परीक्षण किए गए अधिकांश उपकरणों पर अच्छा काम करता है, फिर भी एस 4 मिनी पर, यह नहीं होगा। –

+0

यह 4.3 उपकरणों में काम नहीं करता है ... @ जॉनस्मिथ – Josh

3

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; 
     } 
    } 
3

यहाँ कुछ आधुनिक कोड एक AsynTask का उपयोग करता है एक मुद्दा जहां एंड्रॉयड दुर्घटनाओं आप जब कोशिश करते हैं और मुख्य थ्रेड पर कनेक्ट करने और एक कुल्ला के साथ एक चेतावनी का परिचय और उपयोगकर्ता के लिए विकल्प को दोहराने से बचने के लिए है।

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(); 
+0

यह अच्छा है लेकिन इंटरनेट एक्सेस के बिना वाईफाई कनेक्शन के साथ इसमें काफी समय लगेगा, क्या कोई कामकाज है? –

-1

मैं इस विधि का उपयोग किया था। यह मेरे लिए काम किया! उन लोगों के लिए जो असली इंटरनेट प्राप्त करना चाहते हैं!

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

हर बार इस विधि को करने के लिए! बस एक रिसीवर और =>

httpURLConnection.getResponseCode() == 200 

का उपयोग इसका मतलब यह है इंटरनेट से जुड़ा हुआ है!

+1

इस उत्तर को बेहतर बनाने के लिए, मैं ध्यान दूंगा कि 'थ्रेड' को मुख्य थ्रेड से नहीं कहा जा सकता है और यह 'setReadTimeout' के लिए भी अच्छा होगा। – LordParsley

संबंधित मुद्दे