2012-08-10 11 views
21

मान लीजिए कि फ़ोन खुले वाई-फाई नेटवर्क को ढूंढता है और उससे जुड़ता है। लेकिन वाई-फाई नेटवर्क "निष्क्रिय" है, यानी जब आप ब्राउज़र खोलते हैं तो आपको क्रेडेंशियल्स के लिए तत्काल दिखाई देता है। मेरे फोन पर कई ऐप्स हैं (उदाहरण के लिए वेब ब्राउज़र), जो ऐसे मामलों में काम करने में विफल रहता है। मैं मोबाइल नेटवर्क का उपयोग कर डेटा भेजना चाहता हूं, लेकिन सिस्टम अभी भी वाई-फाई का उपयोग करने का प्रयास करता है।निष्क्रिय वाई-फाई नेटवर्क के साथ सौदा

NetworkInfo.isAvailable() और NetworkInfo.isConnected() अभी भी वर्णित वाई-फाई नेटवर्क के लिएtrue लौट आते हैं। कोई समाधान?

+0

यह गूगल की तरह एक वेबसाइट सरल पिंग करने के लिए संभव होगा? यदि पहुंच बिंदु के पीछे एक लॉगिन पृष्ठ होगा, तो यह सामान्य रूप से सफल होने पर यह असफल हो जाएगा। – Viezevingertjes

+0

AFAIK पिंग मुश्किल है। –

+0

यह http://stackoverflow.com/a/1085054/193892 जैसा है लेकिन एंड्रॉइड के लिए विंडोज़ है। अगर यह अस्तित्व में अच्छा होगा तो अच्छा होगा। –

उत्तर

1

इस प्रयास करें ....

मैं कुछ कस्टम work..but समझ में आ गया है और चल करने के लिए की जरूरत है ...

मेरे कोड switches from Wifi to Mobile network जब इसकी बंद।

और मैं पता चला है कि इंटरनेट मृत है, जबकि वाईफ़ाई कनेक्शन

पर अभी भी है TimeService at port 37 उपयोग कर रहा हूँ /////////////////// /////// संपादित //////////////////////////////////

अब मैं हूं मैंने बनाया complete working code डाल दिया। कृपया मुझे DRY के रूप में क्षमा करें (अपने आप को दोहराएं सिद्धांत) का दुरुपयोग किया गया है। इसलिए कृपया refactor कोड और डुप्लिकेट कोड विधि में यानी एक single sensible place, में जब उत्पादन नेटवर्क में का उपयोग कर परिवर्तित,

/////---------------------------Intial Available Network Checking 



private boolean checkConnection(){ 


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; 

} ///// ----------- ---------------- आरंभिक उपलब्ध नेटवर्क जाँच हो रही है

/////-------------------------------Check for the working Internet Connection 


public boolean inetAddr(){ 

    boolean x1 = false; 


    try { 
     Socket s = new Socket("utcnist.colorado.edu", 37); 

     InputStream i = s.getInputStream(); 

     Scanner scan = new Scanner(i); 

     while(scan.hasNextLine()){ 

      System.out.println(scan.nextLine()); 
      x1 = true; 
     } 
    } catch (Exception e) { 


      x1 = false; 
    } 

    return x1; 

} 

/////-------------------------------Check for the working Internet Connection 


////-------------------------------Check Mobile Conectivity Again 

public boolean mobileConnect(){ 

    boolean conn = false; 
    ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNet = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

    if(activeNet != null){ 

     conn = true; 
    }else{ 

     conn = false; 
    } 

    return conn; 



} 

////------------------------------Check Mobile Conectivity Again 

यहाँ मैं उपरोक्त विधि का प्रयोग कर रहा हूँ ....

try{  
    if (!checkConnection()){ 


     AlertDialog.Builder myAlertDialog = new AlertDialog.Builder(YumZingSplashActivity.this); 
     myAlertDialog.setTitle("--- Connectivity Check ---"); 
     myAlertDialog.setMessage("No Internet Connectivity"); 
     myAlertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { 

      public void onClick(DialogInterface arg0, int arg1) { 

      YumZingSplashActivity.this.finish(); 
      //splashHandler.removeCallbacks(launcherRunnable); 

      }}); 
      System.out.println("No Internet Connectivity"); 

      myAlertDialog.show();   




     } 
     else{ 


       if(inetAddr()){ 
      aphandle = APIHandling.getInstance(); 
      aphandle.xmlCreateSession(); 
      System.out.println("Net Connectivity is Present"); 
      DURATION = Integer.valueOf(getString(R.string.splash_duration)); 



      splashHandler = new Handler(); 

      // ================ Main Code of the Application 
      launcherRunnable = new Runnable() { 

       public void run() { 
        Intent i = new Intent(YumZingSplashActivity.this, YumZingTabHostActivity.class); 
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        startActivity(i); 
        YumZingSplashActivity.this.finish(); 
       } 
      }; 
      if (DEBUG) 
      { 
       splashHandler.post(launcherRunnable); 
      } 
      else{ 


       splashHandler.postDelayed(launcherRunnable, DURATION); 
      } 

     } 
       else{ 

        if(mobileConnect()){ 


         if(inetAddr()){ 
         aphandle = APIHandling.getInstance(); 
         aphandle.xmlCreateSession(); 
         System.out.println("Net Connectivity is Present"); 
         DURATION = Integer.valueOf(getString(R.string.splash_duration)); 



         splashHandler = new Handler(); 

         // ================ Main Code of the Application 
         launcherRunnable = new Runnable() { 

          public void run() { 
           Intent i = new Intent(YumZingSplashActivity.this, YumZingTabHostActivity.class); 
           i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
           startActivity(i); 
           YumZingSplashActivity.this.finish(); 
          } 
         }; 
         if (DEBUG) 
         { 
          splashHandler.post(launcherRunnable); 
         } 
         else{ 


          splashHandler.postDelayed(launcherRunnable, DURATION); 
         } 
         }else{ 

          AlertDialog.Builder myAlertDialog = new AlertDialog.Builder(YumZingSplashActivity.this); 
         myAlertDialog.setTitle("--- Connectivity Check ---"); 
         myAlertDialog.setMessage("No Internet Connectivity"); 
         myAlertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { 

          public void onClick(DialogInterface arg0, int arg1) { 

          YumZingSplashActivity.this.finish(); 
          //splashHandler.removeCallbacks(launcherRunnable); 

          }}); 
          System.out.println("No Internet Connectivity"); 

          myAlertDialog.show();  
         } 
        }else{ 




         AlertDialog.Builder myAlertDialog = new AlertDialog.Builder(YumZingSplashActivity.this); 
         myAlertDialog.setTitle("--- Connectivity Check ---"); 
         myAlertDialog.setMessage("No Internet Connectivity"); 
         myAlertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { 

          public void onClick(DialogInterface arg0, int arg1) { 

          YumZingSplashActivity.this.finish(); 
          //splashHandler.removeCallbacks(launcherRunnable); 

          }}); 
          System.out.println("No Internet Connectivity"); 

          myAlertDialog.show();   






        } 

       } 
     } 

    //setContentView(R.layout.yumzing_splash_layout); 
    } catch(Exception ex){ 

      System.out.println("Leak ko catch"); 
     } 



    } 
+0

ni.is कनेक्ट() उन प्रकार के नेटवर्क के लिए सच हो जाएगा। –

+0

धन्यवाद, मैं एक नज़र डालेगा। –

+0

कृपया मेरे संपादित उत्तर –

2

मुझे एक ही समस्या है, और मुझे जो मिला वह एंड्रॉइड एसडीके के माध्यम से ऐसी कोई संभावना नहीं है, आपको इसे करने का अपना तरीका लिखना होगा।

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

उस स्थिति में, आपको अपनी खुद की जरूरतों के लिए अपना स्वयं का कस्टम टेस्ट लिखना होगा, हां - यही मैंने किया है। मैंने बस साधारण पिंग-जैसी प्रोटोकॉल को लागू किया है (मैं अपनी सॉकेट को उचित आईपी/पोर्ट पर कनेक्ट करने का प्रयास करता हूं और संक्षिप्त उत्तर के लिए संक्षिप्त संदेश भेजता हूं)। केवल मुझे 100% वारंटी देता है कि जिस कनेक्शन को मैं चाहता हूं उसे स्थापित किया जा सकता है।

+1

"आप राउटर से कनेक्ट हो सकते हैं, जो नहीं है इंटरनेट से कनेक्शन "- बिल्कुल –

+0

तो इस [विधि] (http://stackoverflow.com/a/12136830/4385913) के साथ यदि राउटर इंटरनेट से कनेक्शन नहीं है तो यह 'सत्य' वापस आ जाएगा? क्योंकि मेजबान अलग है 'url.getHost() '? –

2

जहां तक ​​मुझे पता है कि वाईफ़ाई पर डेटा कनेक्शन के उपयोग को मजबूर करने का कोई तरीका नहीं है (शायद कुछ ऐसा जो आपको उपयोगकर्ता इंटरैक्शन के बिना नहीं करना चाहिए)।

मेरे पास अपने कई अनुप्रयोगों में समान आवश्यकताएं हैं, मैं जानना चाहता हूं कि स्प्लैश स्क्रीन लोड होने पर उनके पास एक व्यवहार्य नेटवर्क कनेक्शन है (उदाहरण के लिए मैं ऐप का केवल पढ़ने वाला संस्करण दिखाता हूं)।

जिस तरह से मैं इसे प्राप्त करता हूं वह मेरे सर्वर पर isAlive नामक एक सरल सेवा कॉल को आग लगाना है जो केवल एक वास्तविक imedialtly देता है। यह न केवल मुझे बताता है कि मैं अपनी सेवा देख पा रहा हूं, यह भी पुष्टि करता है कि मेरा सर्वर ऑनलाइन है (मेरे अंत में कोई समस्या नहीं है)। अगर मुझे समय-समय पर प्रतिक्रिया नहीं मिलती है तो मैं उपयोगकर्ता को सूचित करता हूं कि उनके पास कोई नेटवर्क कनेक्शन नहीं है और "कृपया सुनिश्चित करें कि जारी रखने से पहले आपके पास वैध डेटा/वाईफाई कनेक्शन है"। मैं फिर वाईफाई के लिए isConnected संपत्ति लेता हूं और इस संदेश को "आपका वर्तमान वायरलेस कनेक्शन इंटरनेट एक्सेस नहीं करता" या कुछ ऐसा कहने के लिए संशोधित करता है।

उतना ही उत्तर नहीं था जिसके लिए आप उम्मीद कर रहे थे लेकिन शायद एक संभावना है?

+0

धन्यवाद, मैं कोशिश करूंगा। –

+0

आप सर्वर की जांच कैसे करते हैं? सरल http अनुरोध? –

+1

मेरे मामले में यह मेरे webservice पर एक कॉल है जिसे TRUE के साथ जवाब देने के लिए कड़ी मेहनत की जाती है।इस तरह अगर मैं सेवा को हिट नहीं कर सकता तो मुझे पता है कि यह झूठा है। लेकिन अगर आप अपवाद मानते हैं तो आप केवल http अनुरोध का उपयोग कर सकते हैं। – melodiouscode

2

बस एक सुझाव: आप requestRouteToHost() का उपयोग करने का प्रयास कर सकते हैं। लेकिन पहले इस विधि का उपयोग करने में समस्याओं के लिए एसओ खोजें।

इसके अलावा आपको CHANGE_NETWORK_STATE अनुमति की आवश्यकता होगी।

1

आप वाईफाई नेटवर्क से कनेक्ट कर सकते हैं, पृष्ठभूमि में किसी भी पेज से कनेक्ट करने का प्रयास कर सकते हैं और सत्यापित कर सकते हैं कि कोई पुनर्निर्देशन है या नहीं। यदि ऐसा है, तो यह क्रेडेंशियल पेज होने की संभावना है। असल में जब मैं समाधान को कार्यान्वित करने का प्रयास कर रहा था, मैंने अभी वर्णन किया है, मैंने इसे एंड्रॉइड डेवलपर्स साइट पर HttpURLConnection class documentation में वर्णित किया है। वहाँ आप पढ़ सकते हैं:

हैंडलिंग नेटवर्क साइन-ऑन

जब तक उपयोगकर्ता एक साइन-ऑन पृष्ठ के माध्यम से क्लिक करता है कुछ Wi-Fi नेटवर्क इंटरनेट का उपयोग ब्लॉक। ऐसे साइन-ऑन पेज आमतौर पर HTTP रीडायरेक्ट का उपयोग करके प्रस्तुत किए जाते हैं। यदि आपका कनेक्शन अप्रत्याशित रूप से पुनर्निर्देशित किया गया है तो आप परीक्षण करने के लिए getURL() का उपयोग कर सकते हैं। प्रतिक्रिया जांचकर्ता प्राप्त होने के बाद तक यह चेक मान्य नहीं है, जिसे आप getHeaderFields() या getInputStream() पर कॉल करके ट्रिगर कर सकते हैं। उदाहरण के लिए, यह देखना होगा कि एक प्रतिक्रिया एक अप्रत्याशित मेजबान पर पुनः निर्देशित नहीं कर रहा था:

HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
    try { 
    InputStream in = new BufferedInputStream(urlConnection.getInputStream()); 
    if (!url.getHost().equals(urlConnection.getURL().getHost())) { 
     // we were redirected! Kick the user out to the browser to sign on? 

    ... 
    } finally { 
    urlConnection.disconnect(); 
    } 
} 
0

प्रयास करें

InetAddress.getByName(host).isReachable(timeOut) 
संबंधित मुद्दे