क्या वास्तव में पदावनत किया जाना चाहिए? मैं इसके बजाय क्या उपयोग कर सकता हूं?


138

क्या "shouldOverrideUrlLoading" वास्तव में पदावनत है? यदि हां, तो मैं इसके बजाय क्या उपयोग कर सकता हूं?

ऐसा लगता है कि एंड्रॉइड एन को लक्ष्यित कियाshouldOverrideUrlLoading गया है और मुझे एपीआई 19 के बाद से एक ऐप काम करने की आवश्यकता है, जो अभी नवीनतम है जो एंड्रॉइड एन (बीटा) है, मैं कुछ सुविधाओं का उपयोग करता हूं जो एंड्रॉइड एन में नए हैं (जैसे डेटा सेवर), इसलिए लक्ष्यीकरण मार्शमैलो इस मुद्दे के साथ मदद नहीं करेगा क्योंकि मुझे उन नई विशेषताओं का उपयोग करने की आवश्यकता है, यहां कोड का उपयोग किया गया है:

public boolean shouldOverrideUrlLoading(WebView webview, String url) {
    if (url.startsWith("http:") || url.startsWith("https:")) {
        ...
    } else if (url.startsWith("sms:")) {
        ...
    }
    ...
}

और यह मैसेज Android Studio ने मुझे दिया है:

'Android.webkit.WebViewClient' में पदावनत पद्धति को ओवरराइड किया जाता है। यह निरीक्षण रिपोर्ट बताती है कि निर्दिष्ट निरीक्षण क्षेत्र में पदावनत कोड का उपयोग किया जाता है।

Google ने उस पदावनति के बारे में कुछ नहीं कहा

मुझे आश्चर्य है कि अगर @SuppressWarnings("deprecation")मुझे एपीआई 19 के बाद से नवीनतम एंड्रॉइड एन बीटा (और इसका अंतिम संस्करण जब यह रिलीज़ हो जाता है) तक सभी उपकरणों पर काम करने दिया जाएगा, तो मैं इसे स्वयं परीक्षण नहीं कर सकता, मैंने कभी इसका उपयोग नहीं किया और मुझे निश्चित होना चाहिए यह काम करता है, इसलिए, कोई भी बता सकता है?


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

सबसे पहले, टिप्पणी के लिए धन्यवाद, मैं जिस संस्करण का उपयोग कर रहा हूं मुझे लगता है कि यह अच्छा है, चूंकि एंड्रॉइड डेवलपर डॉक्स के समान ही है, स्ट्रिंग के नाम को छोड़कर, उन्होंने "दृश्य" का उपयोग किया और मैंने "वेबव्यू" का उपयोग किया , बाकी के लिए एक ही है, इसलिए मुझे इसे सभी संस्करणों पर काम करने के लिए क्यों करना चाहिए?
मिनियन

जवाबों:


95

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

नहीं ऐसा नहीं है।

N डेवलपर प्रीव्यू के लिए जो नया है, उसमें यह विधि हस्ताक्षर है:

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)

एन सहित सभी एंड्रॉइड संस्करणों द्वारा समर्थित एक, में यह विधि हस्ताक्षर है:

public boolean shouldOverrideUrlLoading(WebView view, String url)

तो मुझे इसे सभी संस्करणों पर काम करने के लिए क्यों करना चाहिए?

हटाए गए को ओवरराइड करें, वह Stringजो दूसरे पैरामीटर के रूप में लेता है ।


नमस्ते, और उत्तर के लिए धन्यवाद, जो अभी भी एपीआई 19 के बाद से संगत नहीं है, क्योंकि URL स्ट्रिंग प्राप्त करने के लिए मुझे "url.getUrl () (.String ()" का उपयोग करना होगा और इसे API 21, किसी भी तरह से बनाने के लिए जोड़ा गया है। यह एपीआई 19 के बाद से काम करता है
मिनियन

3
@ संदेश: "यह अभी भी एपीआई 19 के बाद से संगत नहीं है" - हाँ, यह है। "क्योंकि URL स्ट्रिंग प्राप्त करने के लिए मुझे" url.getUrl () .String () "" का उपयोग करना होगा - नहीं, URL को दूसरे पैरामीटर के रूप में प्रदान किया जाता है, एक के रूप में String। उदाहरण के लिए, एपीआई स्तर 19 के खिलाफ संकलित यह नमूना ऐप ठीक काम करता है, जैसे कि एंड्रॉइड 6.0-संचालित नेक्सस 5.
कॉमन्सवेयर

हैलो, "WebResourceRequest अनुरोध" का उपयोग करते हुए स्ट्रिंग पैरामीटर नहीं है
मिनियन

2
@ राय: सही। यह केवल एंड्रॉइड एन (और, संभवतः, उच्चतर) पर काम करता है। आपने पूछा "तो मुझे इसे सभी संस्करणों पर काम करने के लिए क्यों करना चाहिए?"। मैंने आपसे कहा कि एक पदावनत ओवरराइड करें, Stringदूसरा पैरामीटर के रूप में एक । उदाहरण के लिए, मैं जिस सैंपल ऐप से जुड़ा था, जो
डिप्रेक्टेड

6
यदि आप भविष्य में प्रूफ होना चाहते हैं, तो आप वास्तव में बीओटीएच तरीकों को ओवरराइड कर सकते हैं। इस तरह से आपका ऐप <21 पर काम करना जारी रखेगा, लेकिन आप पुरानी पद्धति को पूरी तरह से चित्रित करने के बाद एक बार जाने के लिए तैयार होंगे। और आपको इसके बारे में चिंता करने की ज़रूरत नहीं होगी getUrl()क्योंकि नई विधि केवल 24+ के लिए
कहेगी

187

भविष्य के पाठकों के लिए विस्तार से दस्तावेज:

संक्षिप्त उत्तर आपको दोनों विधियों को ओवरराइड करने की आवश्यकता है। यह shouldOverrideUrlLoading(WebView view, String url)विधि API 24 में पदावनत है और यह shouldOverrideUrlLoading(WebView view, WebResourceRequest request)विधि API 24 में जोड़ी गई है। यदि आप Android के पुराने संस्करणों को लक्षित कर रहे हैं, तो आपको पूर्व विधि की आवश्यकता है, और यदि आप 24 को लक्षित कर रहे हैं (या बाद में, यदि कोई दूर के भविष्य में इसे पढ़ रहा है) यह बाद की विधि को भी ओवरराइड करने की सलाह दी जाती है।

नीचे कंकाल है कि आप इसे कैसे पूरा करेंगे:

class CustomWebViewClient extends WebViewClient {

    @SuppressWarnings("deprecation")
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        final Uri uri = Uri.parse(url);
        return handleUri(uri);
    }

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

    private boolean handleUri(final Uri uri) {
        Log.i(TAG, "Uri =" + uri);
        final String host = uri.getHost();
        final String scheme = uri.getScheme();
        // Based on some condition you need to determine if you are going to load the url 
        // in your web view itself or in a browser. 
        // You can use `host` or `scheme` or any part of the `uri` to decide.
        if (/* any condition */) {
            // Returning false means that you are going to load this url in the webView itself
            return false;
        } else {
            // Returning true means that you need to handle what to do with the url
            // e.g. open web page in a Browser
            final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
            startActivity(intent);
            return true;
        }
    }
}

जैसे shouldOverrideUrlLoading, आप shouldInterceptRequestविधि के लिए एक समान दृष्टिकोण के साथ आ सकते हैं ।


6
@ webo80 वास्तव में इसे API24 / N developer.android.com/reference/android/webkit/…
हेनरी

3
@RequiresApiभविष्य में उपयोग के लिए यहाँ @TargetApi के स्थान पर उपयोग करना बेहतर है
हिब्बीमे

1
कम से कम, दोनों तरीकों को ओवरराइड करने के साथ समस्या यह shouldInterceptRequestहै कि एंड्रॉइड एन + उपकरणों पर वे दोनों को आमंत्रित किया जाता है और आप प्रत्येक पेशाब को दो बार संभाल लेंगे! यह उपाय करने के लिए, मैंने Build.VERSION.SDK_INT < Build.VERSION_CODES.Nपदावनत संस्करण में एक शर्त जोड़ी ।
जोनीक

8
@ जॉनीली आम तौर पर केवल एक विधि लागू की जाएगी। लेकिन अगर आपको super. shouldOverrideUrlLoading(view,request)नॉन-डिप्रेक्टेड मेथड में डालना है, तो हां नॉन-डिप्रेक्टेड और डिप्रेक्टेड मेथड दोनों को इनवाइट किया जाएगा। ऐसा इसलिए है क्योंकि गैर-पदावनत विधि का डिफ़ॉल्ट कार्यान्वयन आंतरिक रूप से पदावनत विधि को लागू करना है। जरा देख लेना WebViewClient.shouldOverrideUrlLoading(WebView view, WebResourceRequest request)। इसलिए सुनिश्चित करें कि आप फोन नहीं करते हैं super.shouldOverrideUrlLoading()
हेनरी

1
केवल यह इंगित करने के लिए कि दोनों विधियों के होने की कार्यक्षमता का दस्तावेजीकरण नहीं किया गया है। मैं उस पर हमेशा भरोसा नहीं करूंगा क्योंकि यह दस्तावेज में उल्लिखित नहीं है।
ऑस्टिन महोनी

15

उपयोग

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
    return shouldOverrideUrlLoading(view, request.getUrl().toString());
}

2
यह view.loadUrl (request.getUrl () .String ()) है;
हिब्बेम

इसका काम है लेकिन अगर हम वापस उपयोग करते हैं तो यह ऐप बंद कर देगा
MRRaja

4
यह 21 से कम एपीआई का समर्थन नहीं करेगा
ममेरा

-1

नीचे की तरह हटाए गए और गैर-पदावनत तरीकों को लागू करें। पहला एक एपीआई स्तर 21 और उच्चतर संभालना है, दूसरा एक एपीआई स्तर 21 से कम संभालना है

webViewClient = object : WebViewClient() {
.
.
        @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
        override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
            parseUri(request?.url)
            return true
        }

        @SuppressWarnings("deprecation")
        override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
            parseUri(Uri.parse(url))
            return true
        }
}

1
यह हेनरी के उत्तर की एक आंशिक प्रति प्रतीत होती है, लेकिन इस मूल्य के द्वारा Uri.parseऔर वापस लौटाता है parseUri। नए उत्तरों में विषय में उपयोगी नई जानकारी और नई अंतर्दृष्टि शामिल होनी चाहिए।
AdrianHHH

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