2012-03-22 22 views
17

के लिए के लिए लॉग इन करने की जरूरत मैं किसी Android ऐप्लिकेशन में HttpClient 4.1 उपयोग कर रहा हूँ और यह मेरे ऐप की एपीआई उन में से एक के द्वारा रोका अनुरोध होने के बारे में स्मार्ट बनाने की कोशिश कर संभाल स्क्रीन "लॉगिन या वाईफाई के लिए भुगतान करने की जरूरत है"।का पता लगाने और वाईफाई

मैं उपयोगकर्ता को लॉगिन करने की अनुमति देने वाला एक वेबदृश्य पॉप अप करना चाहता हूं।

मैं httpclient में रीडायरेक्ट अवरोधन करने की कोशिश कर रहा है, लेकिन मैं असफल रहा हूँ।

this.client = new DefaultHttpClient(connectionManager, params); 

((DefaultHttpClient) this.client).setRedirectStrategy(new DefaultRedirectStrategy() { 
    public boolean isRedirected(HttpRequest request, HttpResponse response, HttpContext context) { 
     boolean isRedirect = Boolean.FALSE; 
     try { 
      isRedirect = super.isRedirected(request, response, context); 
     } catch (ProtocolException e) { 
      Log.e(TAG, "Failed to run isRedirected", e); 
     } 
     if (!isRedirect) { 
      int responseCode = response.getStatusLine().getStatusCode(); 
      if (responseCode == 301 || responseCode == 302) { 
       throw new WifiLoginNeeded(); 
       // The "real implementation" should return true here.. 
      } 
     } else { 
      throw new WifiLoginNeeded(); 
     } 

     return isRedirect; 
    } 
}); 

और फिर मेरी गतिविधि में:

यह मैं वर्तमान में क्या कोशिश कर रहा हूँ है

try { 
    response = httpClient.get(url); 
} catch (WifiLoginNeeded e){ 
    showWifiLoginScreen(); 
} 

जहां शो वाईफाई स्क्रीन करता है:

Uri uri = Uri.parse("http://our-site.com/wifi-login"); 
Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
startActivity(intent); 

सोच यह है:

  • मेरे एपीआई वैध तरीके से अनुप्रेषित कभी नहीं होगा
  • तो मैं कॉन्फ़िगर HttpClient मेरी विशेष RuntimeException फेंकने के लिए जब यह
  • पकड़ने कि गतिविधि कोड में अपवाद है और एक वेब-दृश्य पॉप उन्हें मिल लॉगिन स्क्रीन
  • एक बार जब वे करने के लिए निर्देशित निर्देशित कर दिये है लॉगिन, वाईफाई-लॉगिन उन्हें अच्छी तरह से काम पर बधाई देता है और उन्हें एप

बात यह है कि, मुझे कभी भी वाईफाई लॉग इन नहीं किया गया अपवाद। एंड्रॉइड के साथ इसे पूरा करने का पसंदीदा तरीका क्या है?

+2

सबसे पहले, सुनिश्चित करें कि आपका http सर्वर सही httpReponse (301 या 302) देता है। – yorkw

+0

बात यह है कि यह मेरा सर्वर रीडायरेक्ट नहीं कर रहा है। यह उन वाईफाई एक्सेस पॉइंट्स में से एक है जो सब कुछ "हमारे महंगे वाईफाई में लॉग इन करें" पृष्ठों को इंगित करता है। इसलिए मुझे हर मामले को पकड़ने की जरूरत है जिसे हम पुनर्निर्देशित HTTP कॉल के बारे में सोच सकते हैं। –

+2

यह आपके द्वारा अपेक्षित रीडायरेक्ट का प्रकार भी नहीं हो सकता है - यह भी सुनिश्चित करें कि आपके द्वारा अपेक्षित कोड उत्पन्न किए जा रहे हैं। एक्सेस पॉइंट को आपके द्वारा अपेक्षित विशेष HTTP कोड को वापस करने की आवश्यकता नहीं है और यह खुशी से एक [200] भेज सकता है जो आपको इंगित करता है कि आप उन्हें एक्सेस पॉइंट लॉगिन स्क्रीन पर निर्देशित करते समय ठीक हैं। आप अपनी साइट के आईपी पते को स्टोर करना चाहते हैं और नवीनतम http अनुरोध द्वारा आईपी पते पर इसकी तुलना करना चाहते हैं। यदि वे अलग हैं, तो लॉगिन स्क्रीन को कॉल करें। – RightHandedMonkey

उत्तर

-2

कृपया नीचे दिए गए कोड को देखें। आप यह जांचने के लिए उपयोगी हो सकते हैं कि आप किस प्रकार के कनेक्शन का उपयोग कर रहे हैं।

WifiManager lWifiManager = (WifiManager) OpenYouTubePlayerActivity.this.getSystemService(Context.WIFI_SERVICE); 
TelephonyManager lTelephonyManager = (TelephonyManager) OpenYouTubePlayerActivity.this.getSystemService(Context.TELEPHONY_SERVICE); 

//////////////////////////// 
// if we have a fast connection (wifi or 3g) 
if((lWifiManager.isWifiEnabled() && lWifiManager.getConnectionInfo() != null && lWifiManager.getConnectionInfo().getIpAddress() != 0) || 
    ((lTelephonyManager.getNetworkType() == TelephonyManager.NETWORK_TYPE_UMTS || 

    /* icky... using literals to make backwards compatible with 1.5 and 1.6 */  
    lTelephonyManager.getNetworkType() == 9 /*HSUPA*/ || 
    lTelephonyManager.getNetworkType() == 10 /*HSPA*/ || 
    lTelephonyManager.getNetworkType() == 8 /*HSDPA*/ || 
    lTelephonyManager.getNetworkType() == 5 /*EVDO_0*/ || 
    lTelephonyManager.getNetworkType() == 6 /*EVDO A*/) 

    && lTelephonyManager.getDataState() == TelephonyManager.DATA_CONNECTED) 
    ){ 
     //Do some thing here 
} 
+0

इसके लिए अतिरिक्त अनुमतियों की आवश्यकता है, जिन्हें मैं संभव से बचाना चाहता हूं। यदि आप पहले ही ACCESS_WIFI_STATE अनुमति का उपयोग कर रहे हैं तो मुझे लगता है कि यह जाने का एक अच्छा तरीका है। –

-1

यह मदद मिलेगी

public boolean haveNetworkConnection() { 
    cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); 
      Boolean haveConnectedWifi = false; 
      Boolean haveConnectedMobile = false; 

      NetworkInfo[] netInfo = cm.getAllNetworkInfo(); 
      for (NetworkInfo ni : netInfo) { 
       if (ni.getTypeName().equalsIgnoreCase("WIFI")) 
        if (ni.isConnected()) 
         haveConnectedWifi = true; 
       if (ni.getTypeName().equalsIgnoreCase("MOBILE")) 
        if (ni.isConnected()) 
         haveConnectedMobile = true; 
      } 
      return haveConnectedWifi || haveConnectedMobile; 
     } 
2

एक अधिक सामान्य मामले के रूप में इस छोटे से समाधान का प्रयास करें: आप एक "नमस्ते विश्व" या "पिंग" संदेश की तरह अपने सार्वजनिक एपीआई में कुछ शामिल कर सकते हैं।

GET http://api.example.com/1.0/ping HTTP/1.1 
    Accepts: text/json 

    Content-Type: text/json 
    { ping: "ok", currentAPIVersion: 1.1, minAPIVersion: 1.0 } 

अपने सर्वर को कनेक्ट करने और "पिंग" करने का प्रयास करें। यदि आपके द्वारा अपेक्षित प्रारूप में प्रतिक्रिया वापस नहीं की जाती है, तो उपयोगकर्ता के इरादे के रूप में उसी यूआरएल को अपने वेब ब्राउजर के इस्तेमाल से परिणामों से निपटने के लिए टॉस करें।

यह भी संभाल लेगा: कॉरपोरेट प्रॉक्सी ("कंपनी एक्सवाईजेड आपको मना करता है!"), और भविष्य में अपने स्वयं के एपीआई में असंगत परिवर्तन ("क्षमा करें, हम अब एपीआई के 12 साल के संस्करण का समर्थन नहीं करते हैं। कृपया वहां एक अद्यतन डाउनलोड करें। ")

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