2012-10-01 27 views
11

मैं एक ऐप विकसित कर रहा हूं जो प्रमाणीकरण के लिए ओएथ का उपयोग करता है लेकिन मुझे ओथ कॉलबैक को संभालने में थोड़ी सी समस्या है।यदि वेबव्यू के साथ प्रमाणीकरण किया जाता है तो इरादा फ़िल्टर के साथ OAuth URL कॉलबैक को कैसे संभालें?

प्रमाणीकरण

मेरा ऐप लॉगिन स्क्रीन के रूप में एक वेबव्यू है और मैं अपने वेब दृश्य में प्रमाणीकरण फ़ॉर्म लोड करने के लिए एक यूआरएल को देखते हुए कर रहा हूँ।

https://myoauthhost.com/oauth/auth?response_type=code&client_id=XXXXXXX&redirect_uri=YYYYYYYY&scope=ZZZZZZZZZZ 

और प्रमाणन गतिविधि (AuthActivity.java) में, मैं निम्नलिखित है:

String authURL = https://myoauthhost.com/oauth/auth?response_type=code&client_id=XXXXXXX&redirect_uri=YYYYYYYY&scope=ZZZZZZZZZZ 
    myWebView.loadUrl(authURL); 
Manifest.xml में

, मैं OAuth कॉलबैक के लिए निम्नलिखित है मान लें कि URL है हैंडलिंग:

<activity 
      android:name=".AuthActivity" 
      android:label="@string/app_name" 
      android:screenOrientation="portrait" > 

      <intent-filter> 
       <action android:name="android.intent.action.VIEW" /> 

       <category android:name="android.intent.category.DEFAULT" /> 
       <category android:name="android.intent.category.BROWSABLE" /> 

       <data 
        android:host="authprovider" 
        android:scheme="auth" /> 
      </intent-filter> 
</activity> 

समस्या

यह यूआरएल जब वेबव्यू में उपयोग किया जाता है (loadURL() विधि के साथ) (जिसे वेबव्यू में लोड किया जाना चाहिए) से वास्तविक ओथ वेब युक्त अन्य यूआरएल पर रीडायरेक्ट करता है। समस्या यह है कि यह पुनर्निर्देशन एंड्रॉइड में स्वचालित रूप से इरादा चयन लॉन्च करता है: चूंकि यूआरएल को वेब ब्राउजर द्वारा संभाला जाना चाहिए, एंड्रॉइड आपको यूआरएल खोलने के लिए फोन पर उपलब्ध वेब ब्राउज़र में से एक चुनने देता है।

इस के बाद से नहीं है जो मैं चाहता, मैं इतना है कि पुनर्निर्देशन वेबव्यू भीतर नियंत्रित किया जाता है, लेकिन एक वेब ब्राउज़र (या जो भी) को लॉन्च नहीं है यह कोड शामिल करने के लिए है: इस के साथ ऐसा

myWebView.setWebViewClient(new WebViewClient()); 

कोड, पुनर्निर्देशन "वेबदृश्य के भीतर" संभाला जाता है और मेरे पास लॉगिन स्क्रीन प्रदर्शित होती है।

मैं फिर क्रेडेंशियल्स दर्ज कर सकता हूं (उदाहरण के लिए: ट्विटर के माध्यम से oauth) लेकिन जब प्रमाणीकरण किया जाता है, तो कॉल बैक प्राप्त होता है लेकिन फिर कॉलबैक को संभालने वाली गतिविधि (अभिव्यक्ति में कॉलबैक प्राप्त करने के लिए कॉन्फ़िगर की गई एथएक्टिविटी) लॉन्च नहीं किया गया है इसके बजाए, मेरे पास एक संदेश प्रदर्शित करने वाला वेबव्यू है जिसमें कहा गया है कि यूआरएल कॉलबैक (हमारे मामले में: authprovider: // auth/XXX? Xxx = yyy जैसा कि मैनिफेस्ट में कॉन्फ़िगर किया गया है) नहीं मिला।

कारण यह है कि निम्नलिखित कोड हो सकता है:

myWebView.setWebViewClient(new WebViewClient()); 

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

प्रश्न

मैं इस समस्या को कैसे हल कर सकते हैं? मुझे गतिविधि को कॉलबैक को संभालने में सक्षम होना चाहिए, लेकिन वेबव्यू को इसे लोड करने की कोशिश न करें।

किसी भी मदद की सराहना की हो जाएगा अग्रिम में

धन्यवाद

उत्तर

0

ठीक है, पहले आप जिसे आपकी सेवा प्रदाता द्वारा प्रदान की जाती है फोन की आवश्यकता हो सकती है, अगर वहाँ कोई भी पुनः निर्देश मौजूद हैं आप HTTP स्थिति कोड 3xx मिल जाएगा । इसके बाद यदि कोई रीडायरेक्ट मौजूद है तो आप वास्तविक यूआरएल को कॉल करने का प्रयास कर सकते हैं। सामान्य HTTP प्रतिक्रिया के लिए, आपको HTTP 2xx स्थिति कोड प्राप्त होगा।

+0

मेरे पास 'खाता प्रबंधक' और 'एंड्रॉइड: लॉन्चमोड = "सिंगल इंस्टेंस" के साथ काम करने के लिए ओथ को एकीकृत करने का प्रयास करने का एक अलग मामला था। – d370urn3ur

23

अपने मेनिफ़ेस्ट में सब से पहले, अपनी गतिविधि के लिए इन गुणों कि WebView

android:launchMode="singleInstance" 

की शुरूआत और के रूप में

<intent-filter> 
    <action android:name="android.intent.action.VIEW" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
    <category android:name="android.intent.category.BROWSABLE" /> 
    <data android:scheme="oauth-testing" /> 
</intent-filter> 
तो अपने कोड में

जब उपयोगकर्ता है कि करने के लिए लक्ष्य फ़िल्टर जोड़ने सेट लॉगिन बटन पर क्लिक

mReqToken = mTwitter.getOAuthRequestToken(CALLBACK_URL); 
WebView webView = new WebView(this); 
webView.requestFocus(View.FOCUS_DOWN); 
webView.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
      case MotionEvent.ACTION_UP: 
      if (!v.hasFocus()) { 
       v.requestFocus(); 
      } 
      break; 
     } 
     return false; 
    } 
}); 
webView.loadUrl(mReqToken.getAuthenticationURL()); 
mainLayout.removeAllViews(); 
mainLayout.addView(webView); 

यहां कॉलबैक यूआरएलहै 0 private static final String CALLBACK_URL = "oauth-testing:///";
और आप एक गतिशील वेबव्यू बना रहे हैं और उपयोगकर्ता को प्रदर्शित कर रहे हैं। और वेबव्यू में लॉग इन करने के बाद बंद हो गया है और कोड onNewIntent() पर आता है। वहां लॉग इन करने के बाद आपको अपनी कार्यक्षमता को लागू करने की आवश्यकता है।

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    dealWithTwitterResponse(intent); 
} 
private void dealWithTwitterResponse(Intent intent) { 
    Uri uri = intent.getData(); 
    System.out.println("URI=" + uri); 
    if (uri != null && uri.toString().startsWith(CALLBACK_URL)) { 
     String oauthVerifier = uri.getQueryParameter("oauth_verifier"); 
     authoriseNewUser(oauthVerifier); 
    } 
} 

मैं जानता हूँ कि मैं कोड का टुकड़ा, जिनमें से कुछ प्रासंगिक नहीं हो सकता है की एक बहुत कुछ जोड़ लिया है, लेकिन मैं यह किसी किसी दिन में मदद मिलेगी उम्मीद है।

+0

यह सुनिश्चित नहीं है कि यह उत्तर स्वीकार क्यों किया गया है! – Umair

0

जैसा कि आपके पास वेबव्यू का ऑब्जेक्ट है, इसलिए आप इसे अधिभारित कर सकते हैं और फिर इन दो तरीकों से यूआरएल को अपनी गतिविधि पर नेविगेट कर सकते हैं।

private class MyWebView extends WebViewClient{ 
      @TargetApi(Build.VERSION_CODES.N) 
      @Override 
      public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest request) 
      { 
       Uri uri = request.getUrl(); 
       return shouldOverrideUrlLoading(uri.toString()); 
      } 

      private boolean shouldOverrideUrlLoading(final String url) 
      { 
       Log.i(TAG, "shouldOverrideUrlLoading() URL : " + url); 
        //your code to handle the url for navigation will go here 
       try{ 
         if(url.contains("yourcondition")){ 
         //1st way to handle 
         Intent intent = new Intent(Intent.ACTION_VIEW); 
         intent.setData(Uri.parse(url)); 
         YourActivity.this.startActivity(intent); 
         }else{ 
          //2nd way 
         Intent intent = new Intent(YourActivity.this,NewActivity.class); 
         //you can set the data 
         intent.setData(Uri.parse(url)); 
         YourActivity.this.startActivity(intent); 
         } 
        }catch(ActivityNotFoundException e) {  
         Log.e(LOGTAG,"Could not load url"+url); 
        }      
       return false; 
       // return true; // this True means that application wants to leave the WebView and try to go to browser and handle the url itself, otherwise return false. 
      } 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) 
    { 


     try { 
       if(url.contains("yourcondition")){ 
       //1st way to handle 
       Intent intent = new Intent(Intent.ACTION_VIEW); 
       intent.setData(Uri.parse(url)); 
       YourActivity.this.startActivity(intent); 
      }else{ 
      //2nd way 
      Intent intent = new Intent(YourActivity.this,NewActivity.class); 
      //you can set the data 
      intent.setData(Uri.parse(url)); 
      YourActivity.this.startActivity(intent); 
      } 

     } catch(ActivityNotFoundException e) { 

      Log.e(LOGTAG,"Could not load url"+url); 
     } 

     return false;  
    } 
} 

आप mWebView.setWebViewClient(new WebViewClient()); जो डिफ़ॉल्ट है निर्धारित कर सकते हैं लेकिन द्वारा सिर्फ एक डिफ़ॉल्ट कस्टम WebViewClient केवल WebView ब्राउज़र के बजाय WebView के भीतर किसी भी लोड यूआरएल ही अर्थात को संभालने के लिए अनुमति देगा जोड़ने।

लेकिन अगर आप class MyWebViewmWebView.setWebViewClient(new MyWebView()); की तरह ऊपर से गुजर द्वारा ओवरलोड तो आप यूआरएल एक ही बात की लोडिंग यू

myWebView.setWebViewClient(new WebViewClient(){ 

       @TargetApi(Build.VERSION_CODES.N) 
       @Override 
       public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest request) 
       { 
        Uri uri = request.getUrl(); 
        return shouldOverrideUrlLoading(uri.toString()); 
       } 

       private boolean shouldOverrideUrlLoading(final String url) 
       { 
        Log.i(TAG, "shouldOverrideUrlLoading() URL : " + url); 
         //your code to handle the url for navigation will go here 
        try{ 
          if(url.contains("yourcondition")){ 
          //1st way to handle 
          Intent intent = new Intent(Intent.ACTION_VIEW); 
          intent.setData(Uri.parse(url)); 
          YourActivity.this.startActivity(intent); 
          }else{ 
           //2nd way 
          Intent intent = new Intent(YourActivity.this,NewActivity.class); 
          //you can set the data 
          intent.setData(Uri.parse(url)); 
          YourActivity.this.startActivity(intent); 
          } 
         }catch(ActivityNotFoundException e) {  
          Log.e(LOGTAG,"Could not load url"+url); 
         }      
        return false; 
        // return true; // this True means that application wants to leave the WebView and try to go to browser and handle the url itself, otherwise return false. 
       } 

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) 
    { 

     try { 
      if(url.contains("yourcondition")){ 
      //1st way to handle 
      Intent intent = new Intent(Intent.ACTION_VIEW); 
      intent.setData(Uri.parse(url)); 
      YourActivity.this.startActivity(intent); 
      }else{ 
      //2nd way 
       Intent intent = new Intent(YourActivity.this,NewActivity.class); 
      //you can set the data 
      intent.setData(Uri.parse(url)); 
      YourActivity.this.startActivity(intent); 
      }  
     } catch(ActivityNotFoundException e) { 

      Log.e(LOGTAG,"Could not load url"+url); 
     } 

     return false;  

    }}); 

हासिल कर सकते हैं मामले में आप तो वेबव्यू वस्तु का नियंत्रण नहीं है नियंत्रित कर सकते हैं यह नहीं है एक बार मैं इसे हल करने के बाद समाधान अद्यतन करूंगा।