दिलचस्प पोस्ट
ट्विटर एपीआई त्रुटि 215 इंटेल सिंटैक्स में क्लैग के साथ असेंबली कोड कैसे तैयार करें? आप आर में पुस्तकालय स्थान कैसे बदल सकते हैं? UITableView में चलती सेल के लिए डिफ़ॉल्ट आइकन बदलें कई पेजों के लिए पेज नेविगेशन कैसे करें? लॉगरिदमिक पेज नेविगेशन iTextSharp- जेनरेट किए गए पीडीएफ अब एडोब रीडर एक्स में संवाद सहेजें पर्ल की बैकल्टी, सिस्टम और एप के बीच क्या अंतर है? सरणी के लिए स्विफ्ट स्ट्रिंग कन्वर्ट यूआरएल में बैक बटन / हैश बदलें का पता लगा रहा है जावा में फर्चा लूप में कॉलिंग हटाने गतिविधि शुरू होने पर नरम कीबोर्ड छिपाने के लिए यूनिक्स: छंटाई के बिना डुप्लिकेट लाइनों को हटाने कैसे Angular.js में parseInt जावास्क्रिप्ट त्रुटि (अनक्यूट सिंटैक्स त्रुटि: इनपुट का अनपेक्षित अंत) जावा में मौद्रिक मूल्यों का प्रतिनिधित्व करना

एंड्रॉइड के वेबदृश्य में जावास्क्रिप्ट से रिटर्न वैल्यू कैसे प्राप्त करें?

मुझे एंड्रॉइड में जावास्क्रिप्ट से रिटर्न वैल्यू मिलना है I मैं इसे iPhone के साथ कर सकता हूं, लेकिन मैं एंड्रॉइड के साथ नहीं कर सकता मैंने loadUrl का उपयोग किया था, लेकिन किसी ऑब्जेक्ट के बजाय इसे शून्य दिया। कोई भी मेरी मदद कर सकता हैं? धन्यवाद।

Solutions Collecting From Web of "एंड्रॉइड के वेबदृश्य में जावास्क्रिप्ट से रिटर्न वैल्यू कैसे प्राप्त करें?"

यहां पर यह है कि आप इसे कैसे पूरा कर सकते हैं:

अपने वेबविवे में यह क्लाइंट जोड़ें:

final class MyWebChromeClient extends WebChromeClient { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { Log.d("LogTag", message); result.confirm(); return true; } } 

अब आपके जावास्क्रिप्ट कॉल में करें:

 webView.loadUrl("javascript:alert(functionThatReturnsSomething)"); 

अब onJsAlert कॉल "संदेश" में वापस मूल्य शामिल होगा।

Keith समान लेकिन कम जवाब

 webView.addJavascriptInterface(this, "android"); webView.loadUrl("javascript:android.onData(functionThatReturnsSomething)"); 

और फ़ंक्शन को कार्यान्वित करें

 @JavascriptInterface public void onData(String value) { //.. do something with the data } 

onData सूची से onData को हटाने के लिए मत भूलें (यदि आपने onData सक्षम किया हुआ है)

जावा ऑब्जेक्ट को जावास्क्रिप्ट पर्यावरण में जोड़ने के लिए addJavascriptInterface() का उपयोग करें अपना जावास्क्रिप्ट उस जावा ऑब्जेक्ट पर अपने "वापसी मूल्य" की आपूर्ति करने के लिए एक विधि कॉल करें

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

एंड्रॉइड 2.2 और ऊपर में काम करता है (कॉमन्स-लैंग की आवश्यकता है क्योंकि मुझे जावा कोड के रूप में eval () के पास मेरे कोड स्निपेट की आवश्यकता होती है। आप कोड को कोटेशन मार्क्स में लपेटकर इस निर्भरता को निकाल सकते हैं, लेकिन function(){} ) में

सबसे पहले, इसे अपनी जावास्क्रिप्ट फ़ाइल में जोड़ें:

 function evalJsForAndroid(evalJs_index, jsString) { var evalJs_result = ""; try { evalJs_result = ""+eval(jsString); } catch (e) { console.log(e); } androidInterface.processReturnValue(evalJs_index, evalJs_result); } 

फिर, इसे अपनी एंड्रॉइड गतिविधि में जोड़ें:

 private Handler handler = new Handler(); private final AtomicInteger evalJsIndex = new AtomicInteger(0); private final Map<Integer, String> jsReturnValues = new HashMap<Integer, String>(); private final Object jsReturnValueLock = new Object(); private WebView webView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); webView = (WebView) findViewById(R.id.webView); webView.addJavascriptInterface(new MyJavascriptInterface(this), "androidInterface"); } public String evalJs(final String js) { final int index = evalJsIndex.incrementAndGet(); handler.post(new Runnable() { public void run() { webView.loadUrl("javascript:evalJsForAndroid(" + index + ", " + "\"" + StringEscapeUtils.escapeEcmaScript(js) + "\")"); } }); return waitForJsReturnValue(index, 10000); } private String waitForJsReturnValue(int index, int waitMs) { long start = System.currentTimeMillis(); while (true) { long elapsed = System.currentTimeMillis() - start; if (elapsed > waitMs) break; synchronized (jsReturnValueLock) { String value = jsReturnValues.remove(index); if (value != null) return value; long toWait = waitMs - (System.currentTimeMillis() - start); if (toWait > 0) try { jsReturnValueLock.wait(toWait); } catch (InterruptedException e) { break; } else break; } } Log.e("MyActivity", "Giving up; waited " + (waitMs/1000) + "sec for return value " + index); return ""; } private void processJsReturnValue(int index, String value) { synchronized (jsReturnValueLock) { jsReturnValues.put(index, value); jsReturnValueLock.notifyAll(); } } private static class MyJavascriptInterface { private MyActivity activity; public MyJavascriptInterface(MyActivity activity) { this.activity = activity; } // this annotation is required in Jelly Bean and later: @JavascriptInterface public void processReturnValue(int index, String value) { activity.processJsReturnValue(index, value); } } 

समाधान है कि @ फेलिक्स खाजिन ने काम करने का सुझाव दिया है, लेकिन एक महत्वपूर्ण बिंदु अनुपलब्ध है

WebView में वेब पेज लोड होने के बाद जावास्क्रिप्ट कॉल किया जाना चाहिए। WebViewClient को WebView जोड़ें, साथ ही WebChromeClient

पूर्ण उदाहरण:

 @Override public void onCreate(Bundle savedInstanceState) { ... WebView webView = (WebView) findViewById(R.id.web_view); webView.getSettings().setJavaScriptEnabled(true); webView.setWebViewClient(new MyWebViewClient()); webView.setWebChromeClient(new MyWebChromeClient()); webView.loadUrl("http://example.com"); } private class MyWebViewClient extends WebViewClient { @Override public void onPageFinished (WebView view, String url){ view.loadUrl("javascript:alert(functionThatReturnsSomething())"); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; } } private class MyWebChromeClient extends WebChromeClient { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { Log.d("LogTag", message); result.confirm(); return true; } } 

एपीआई 1 9 + पर, यह करने का सबसे अच्छा तरीका है अपने वेबविवे पर जावास्क्रिप्ट को कॉल करें मूल्यांकन :

 webView.evaluateJavascript("foo.bar()", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { // value is the result returned by the Javascript as JSON } }); 

अधिक विस्तार के साथ संबंधित उत्तर: https://stackoverflow.com/a/20377857