2016-03-30 8 views
11

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

मेरा प्रयास समाधान कुछ जावास्क्रिप्ट को पुशस्टेट में हुक करना और ब्राउज़र ऐप लॉन्च करने के लिए एंड्रॉइड कोड चलाने के लिए एक इंटरफ़ेस का उपयोग करना है।

public class LaunchExternalBrowserHack { 
    Context mContext; 

    LaunchExternalBrowserHack(Context c) { 
     mContext = c; 
    } 

    @JavascriptInterface 
    public void launchExternalBrowser(String url) { 
     openUrl(url); 
    } 
} 

मैं onPageFinished() में पेज में कुछ जावास्क्रिप्ट इंजेक्शन लगाने कर रहा हूँ:,

private final String javascript = "javascript:history.pushState = function (state, title, url) { console.log(url); console.log(location.href); Uphoria.launchExternalBrowser(location.origin, url); };"; 

और की:

public void onPageFinished(WebView view, String url) { 
    mWebView.loadUrl(javascript); 
} 

यहाँ मेरी जावास्क्रिप्ट है

यहाँ मेरी इंटरफेस है बेशक, मैं WebView पर इंटरफ़ेस जोड़ रहा हूं:

mWebView.addJavascriptInterface(new LaunchExternalBrowserHack(getContext()), "Android"); 

तो ऐसा लगता है कि यह काम करता है। ब्राउज़र ऐप लॉन्च हो रहा है और अगला पेज खुल रहा है।

हालांकि, वेबव्यू भी आगे बढ़ रहा है। मैं इसे रोकना चाहता हूं, लेकिन मुझे वेबव्यू आगे बढ़ने से रोकने का कोई तरीका नहीं मिल रहा है, जबकि मुझे अभी भी अग्रेषण यूआरएल कैप्चर करने और ब्राउज़र ऐप लॉन्च करने की इजाजत मिल रही है। जैसा कि मैंने पहले उल्लेख किया था, इस वेबपृष्ठ के साथ, shouldOverrideUrlLoading फायरिंग नहीं है।

विचार?

+0

आप 'onReceiveValue (...)' में एक परिणाम नहीं मिल रहा है का उल्लेख यह देख सकते हैं। क्या आप देख सकते हैं कि फ़ंक्शन कॉल में जावास्क्रिप्ट को बदलना काम करेगा या नहीं? [इस जवाब] की तरह (http://stackoverflow.com/a/19790911/503508) सुझाव देता है। विशेष रूप से, इस शैली में: '(फ़ंक्शन() {वापसी {var1: \" variable1 \ ", var2: \" variable2 \ "};})();' – Knossos

उत्तर

1

यह उत्तर गलत है। यहां पर रखा गया क्योंकि इसकी महत्वपूर्ण प्रासंगिक टिप्पणियां हैं।

कारण यह है कि आपको अपने जावास्क्रिप्ट से कोई परिणाम नहीं मिल रहा है, यह है कि आप सीधे फ़ंक्शन को कॉल नहीं कर रहे हैं। आप अपने जावास्क्रिप्ट में एक फ़ंक्शन असाइन कर रहे हैं जो एक मान देता है, लेकिन यह आपके कोड पर वापस नहीं लौटाएगा, यह history.pushState() पर जो कुछ भी कॉल करेगा उसे वापस कर देगा।

private final String javascript = "javascript:" + "var pushState = history.pushState; history.pushState = function() " + 
     "{ pushState.apply(history, arguments); console.log(arguments); return location.href; " + 
     "};"; 

इसके बजाय, आप परीक्षण कर सकते हैं कि क्या कुछ इस तरह आप एक मान देता है:

private final String javascript = "(function() { return location.href; })();"; 
+0

क्या यह तुरंत वापस नहीं आएगा? मैं चाहता हूं कि हैंडलर आग लगाना चाहें जब उपयोगकर्ता उस चीज़ पर टैप करता है जो उसे नेविगेट करने का कारण बनता है। – Andrew

+0

हां यह तुरंत वापस आ जाएगा। मुझे नहीं लगता कि आप उस शैली में कॉलबैक चला सकते हैं जिसके बारे में आप सोच रहे हैं। आप सीधे उस समारोह के माध्यम से जावास्क्रिप्ट का मूल्यांकन कर रहे हैं। आप तुरंत जेएस भेज देंगे, इसका मूल्यांकन किया जाएगा और एक मूल्य वापस कर दिया जाएगा (यदि दिया गया है)। हालांकि, आपके कोड में आप एक फ़ंक्शन की सेटिंग का मूल्यांकन कर रहे हैं, और यही वह है। आप कल्पनापूर्वक 'webView.addJavascriptInterface' का उपयोग कर सकते हैं। क्या आपने इसकी जांच की है? – Knossos

+0

हाँ, लेकिन मेरा इंटरफ़ेस एंड्रॉइड 4.4+ पर आग लग रहा है। यह ठीक प्री-4.4 काम करता है। – Andrew

5

उपयोगकर्ता पेज से दूर जाने की कोशिश कर रहा है। उसे बाहर जाने से रोकने के लिए, झूठी वापसी। उसे दूर जाने के लिए, कुछ भी वापस न करें, लेकिन आप जो भी कोड चाहते हैं उसे निष्पादित कर सकते हैं। पृष्ठ रीफ्रेश सहित नेविगेशन ईवेंट होने पर यह ईवेंट तत्काल निकाल दिया जाता है।

private final String javascript = "window.onbeforeunload = function(){ dosomething(); }; window.unload = function(){ dosomething(); }; function dosomething() { /* Write code here */ };" 

आप, ऊपर पूरे जावास्क्रिप्ट कोड शामिल करने की जरूरत के बाद से कुछ ब्राउज़रों onbeforeunload और कुछ का उपयोग unload

संपादित

का उपयोग आपकी समस्या को मैं अपने समाधान पाया थोड़ा काम का हो के सावधान पढ़ने के बाद ।

history का उपयोग करके यहां एक और दृष्टिकोण है। यदि आपका इतिहास खाली है, तो इसका अर्थ यह पहला पृष्ठ है।लेकिन अगर आपके पास इतिहास में कुछ आइटम हैं, तो इसका मतलब है कि नेविगेशन हुआ है।

आप के रूप में निम्नलिखित

private final String javascript = "javascript:"+"if(window.history.length>=1 && document.referrer=='') Android.launchExternalBrowser(location.href);"; 
संबंधित मुद्दे