Android WebView, ब्राउज़र खोलने के बजाय ऐप में रीडायरेक्ट को कैसे हैंडल करें


120

इसलिए अभी मेरे ऐप में मैं जिस URL को एक्सेस कर रहा हूं उसमें एक रीडायरेक्ट है, और ऐसा होने पर वेबव्यू मेरे ऐप में रहने के बजाय एक नया ब्राउज़र खोलेगा। क्या कोई ऐसा तरीका है जिससे मैं सेटिंग्स बदल सकता हूं ताकि व्यू सामान्य की तरह URL पर पुनर्निर्देशित हो जाए, लेकिन एक नया ब्राउज़र खोलने के बजाय मेरे ऐप में रहें?

संपादित करें:

मुझे रीडायरेक्टिंग URL चाहिए, मुझे नहीं पता कि इसे कैसे बनाया जाए, इसलिए उस URL को प्राप्त करने का एकमात्र तरीका यह है कि मैं जो चाहता हूं उस पर पुनर्निर्देशित कर दूं।

उदाहरण के लिए: जब आप यहां जाते हैं: http://www.amazon.com/gp/aw/s/ref=is_box_/k=9780735622777 ध्यान दें कि यह URL को वास्तविक उत्पाद पर पुनर्निर्देशित कैसे करेगा। मेरे ऐप में, अगर मैं इसे एक नए ब्राउज़र में खोलता हूं, तो यह ठीक होगा, हालांकि अगर मैं इसे अपने ऐप में एक WebView के साथ रखता हूं, तो यह दिखाएगा कि यह k = 9780735622777 की खोज कर रहा है, जैसे कि यह http://www.amazon.com/gp/aw/s/ref=is_s_?k=k%3D9780735622777&x=0&y=0 । या, यह ब्राउज़र में दृश्य को खोल देगा और दिखाएगा कि क्या उपयुक्त है। हालांकि, मैं अपने ऐप में सब कुछ रखना चाहता हूं।

जवाबों:


253

एक WebViewClient बनाएँ, और ओवरऑवरराइड यूआरएललोडिंग विधि को ओवरराइड करें ।

webview.setWebViewClient(new WebViewClient() {
    public boolean shouldOverrideUrlLoading(WebView view, String url){
        // do your handling codes here, which url is the requested url
        // probably you need to open that url rather than redirect:
        view.loadUrl(url);
        return false; // then it is not handled by default action
   }
});

8
मुझे ऐसे उत्तर पसंद हैं जो विधि की तरह हैं () {// बस आप जिस कोड का उपयोग करना चाहते हैं उसे कोड में
रखें

19
कृपया ऊपर दिए गए कोड की नकल न करें। कॉल करने के बजाय view.loadUrl पर कॉलबैक से गलत लौटें। कॉलिंग लोड यूआरएल एक सूक्ष्म बग का परिचय देता है, जहां यदि आपके पास कस्टम स्कीम URL के साथ पृष्ठ के भीतर कोई iframe है (जैसे <iframe src = "tel: 123" />) यह आपके ऐप के मुख्य फ्रेम को उस URL पर नेविगेट करेगा, जो एप्लिकेशन को तोड़ रहा है। एक साइड इफेक्ट।
marcin.kosiba

@ marcin.kosiba निर्भर करता है कि इसका उपयोग कैसे किया जाता है, मेरे उपयोग के मामले के लिए जो आप वर्णन करते हैं वह एक मुद्दा नहीं है, लेकिन मैं अभी भी सिर की सराहना करता हूं :)
Warpzit

@Arpzit - यकीन है, अगर आप केवल विश्वसनीय सामग्री को वेबव्यू में लोड करते हैं और 100% गारंटी देते हैं कि कोई भी उस गड़बड़, ठीक का फायदा नहीं उठा सकता है। OTOH जोखिम क्यों चलाते हैं?
marcin.kosiba

1
मैं उस url को कैसे जान सकता हूं जिसे shouldOverrideUrlLoadingविधि में कहा जाता है वह है अगला पुनर्निर्देशित url? और मैं इसे अनुमति देना चाहता हूं?
फान सिंह

21

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

    myWebView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }
    });

8
इससे भी बेहतर सिर्फ myWebView.setWebViewClient (नए WebViewClient ()) को कॉल करें; ShouldOverrideUrlLoading का डिफ़ॉल्ट कार्यान्वयन गलत है।
साइबराइन्स

14

बस एक डिफ़ॉल्ट कस्टम जोड़ना WebViewClientहोगा। यह WebView किसी भी लोड किए गए url को स्वयं संभालता है।

mWebView.setWebViewClient(new WebViewClient());

8

आपको url को लोड करने से पहले अपने वेबव्यू के लिए अपना कस्टम WebviewClient ओवरराइडिंग shouldOverrideUrlLoading विधि सेट करना होगा ।

mWebView.setWebViewClient(new WebViewClient()
        {
            @SuppressWarnings("deprecation")
            @Override
            public boolean shouldOverrideUrlLoading(WebView webView, String url)
            {
                return shouldOverrideUrlLoading(url);
            }

            @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);

                // Here put your code

                return true; // Returning True means that application wants to leave the current WebView and handle the url itself, otherwise return false.
            }
        });

वेबव्यू में रीडायरेक्ट urls और डाउनलोड के बिना PDF खोलने के लिए उदाहरण कोड चेकआउट करें। https://gist.github.com/ashishdas09/014a408f9f37504eb2608d98abf49500


ध्यान दें कि एक उदाहरण कोड के लिए उपरोक्त लिंक मौजूद नहीं है।
जेटडॉग

मैंने लिंक अपलोड कर दिया है।
आशीष दास

मेरे लिए काम किया धन्यवाद @AshishDas +10
livemaker

2

कृपया नीचे कोटलिन कोड का उपयोग करें

webview.setWebViewClient(object : WebViewClient() {
            override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {   
                view.loadUrl(url)
                return false 
            }
        })

अधिक जानकारी के लिए यहां क्लिक करें


2

एक वर्ग बनाएं जो वेबव्यूक्लि को लागू करता है और निम्न कोड जोड़ें जो url स्ट्रिंग को नीचे दिखाए अनुसार अनुमति देता है। आप इन्हें देख सकते हैं [उदाहरण] [१]

public class myWebClient extends WebViewClient {

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
         view.loadUrl(url); 
         return true;
     }
}

अपने निर्माता पर, नीचे दिखाए गए अनुसार एक वेबव्यू ऑब्जेक्ट बनाएं।

   web = new WebView(this); web.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); 

फिर अपने ऐप के अंदर यूआरएल लोड करने के लिए निम्न कोड जोड़ें

       WebSettings settings=web.getSettings(); 
    settings.setJavaScriptEnabled(true); 
    
    web.loadUrl("http://www.facebook.com");
    web.setWebViewClient(new myWebClient()); 
   
 web.setWebChromeClient(new WebChromeClient() {
      // 
      //
    }

0
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
    super.onPageStarted(view, url, favicon);
    if (url.equals("your url")) {
        
            Intent intent = new Intent(view.getContext(), TransferAllDoneActivity.class);
            startActivity(intent);
        
    }
}

आपका स्वागत है, क्या आप अपना कोड समझाना चाहेंगे और हमें बताएंगे कि यह सही उत्तर क्यों है?
अली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.